转载:原文链接
从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等工具能实现更高效的开发。