转载:原文链接

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

项目介绍

先来看看我们的项目。

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

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

有源码的编译

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

编译命令:

javac -d .targetbuild1 --module-source-path ".;.lib" .testmodule-info.java .testtestMain.java

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

通过class文件编译

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

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

javac -d .targetbuild2 --module-source-path ".;.lib" .libhellomodule-info.java .libhellohelloHello.java

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

javac -d .targetbuild2 --module-source-path "." -p ".targetbuild2" .testmodule-info.java .testtestMain.java

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

通过jar文件编译

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

首先把hello2编译成jar。

mkdir target/build3jar -cvf .targetbuild3hello.jar -C .targetbuild2hello .

然后编译

javac -d .targetbuild3 --module-source-path "." -p ".targetbuild3" .testmodule-info.java .testtestMain.java

结果非常符合预期。

写在最后

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

文章来源于互联网:
Javac多模块化编译