Javac多模块化编译

转载:原文链接

从SDK9开始,Java支持多模块编译。那么,怎么用javac实现多模块编译呢?

项目介绍

先来看看我们的项目。

首先lib文件夹下是依赖模块,有一个hello模块。hello模块包含hello包,并且被导出。

然后是test,是我们的主模块,包含一个test包,里面有个叫Main的主类。

有源码的编译

首先,我们模拟,我们具有这两个类的源码时的编译。

编译命令:

javac -d .\target\build1 --module-source-path ".;.\lib" .\test\module-info.java .\test\test\Main.java

首先,-d是输出路径。--module-source-path是模块源码的保存路径。在这些路径下,直接保存这些模块的源码。文件名就是模块名(即使模块名包含".",文件名也是包含"."的模块名,而不是多级目录),这些文件名下直接就有module-info.java文件。.路径指当前路径,也就是test包的位置,.\lib则是hello包的路径。

通过class文件编译

有时候,我们没有Hello包的源码,那么怎么办呢?

先模拟这个环境,编译hello包:

javac -d .\target\build2 --module-source-path ".;.\lib" .\lib\hello\module-info.java .\lib\hello\hello\Hello.java

此时,hello包将编译在.\target\build2\hello位置,那么.\target\build2就是包存放的位置了。

javac -d .\target\build2 --module-source-path "." -p ".\target\build2" .\test\module-info.java .\test\test\Main.java

然后编译test,此时使用-p来指示模块的位置。

通过jar文件编译

jar文件编译和class文件编译其实很类似,我们来试一下。

首先把hello2编译成jar。

mkdir target/build3jar -cvf .\target\build3\hello.jar -C .\target\build2\hello .

然后编译

javac -d .\target\build3 --module-source-path "." -p ".\target\build3" .\test\module-info.java .\test\test\Main.java

结果非常符合预期。

写在最后

通过上面的操作,我们就能自己编译我们的java多模块工程了。当然,借助maven等工具能实现更高效的开发。