我正在尝试使用JDK9's new AOT功能编译应用服务器,并面临许多挑战。
appserver包含~180 MB的罐子;一起编译overflows integer所以我试图将每个模块编译成一个(.so)库。这些模块与其他模块有依赖关系,因此我必须使用-J-cp -J
依赖项将它们放在类路径中。这导致了4.4 GB的libs - 因为AOT应该加速服务器启动,你可以想象从磁盘加载它并没有真正帮助。 (可以剥离那些调试信息的库,但我们仍然在谈论与罐子相比规模增长的顺序。)
我很失望,jaotc
实际上是类加载编译的类,它触发了静态构造函数(这有时会给我带来错误)。此外,编译器无法处理缺少的引用类,有时这只是一个运行时依赖 - 即使没有它们,服务器也没有问题。所以我必须提供空的模拟类来满足编译器。
但是,当使用AOT跟踪(-Xlog:aot+class+load=trace:file=/tmp/aot.txt:none
而不是stdout -XX:+PrintAOT
)运行服务器时,我发现libs也包含部分依赖项:
found java.lang.Object in /home/user/aot/common/libjava.base-coop.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found java.lang.Object in /home/user/aot/appserver/lib/libcom.example.module1.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found java.lang.Object in /home/user/aot/appserver/lib/libcom.example.module2.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
这证实了我的疑问,lib只包含了我给编译器编译的jar代码,但至少包含了超类的代码。我也不确定JVM在多个库中找到相同类时的行为。
是否可以删除重复项?什么是大/多库项目的推荐方法?
答案 0 :(得分:-1)
在Java 9中处理多罐依赖关系的推荐方法是模块和模块化罐。
模块化的jar罐越多,编译器生成最终结果的体积就越小。
https://www.oracle.com/corporate/features/understanding-java-9-modules.html