[英]Java 9 third-party module « linking », how?, when? -> java.lang.NoClassDefFoundError
Please do not provide solutions using Maven, Gradle… I look for a CLI solution only .请不要提供使用Maven,摇篮的解决方案......我找只CLI的解决方案。 No jlink-based solution as well.
也没有基于 jlink 的解决方案。
Given Open_My_type_module-1.0.jar
as a preexisting compiled Java 9 module:将
Open_My_type_module-1.0.jar
作为预先存在的已编译 Java 9 模块:
module Open_My_type_module { // module-info.java
exports Open_My_type_package;
opens Open_My_type_package;
}
The code in this module only declares the following class:该模块中的代码仅声明了以下类:
Open_My_type_package.My_type
Open_My_type_package.My_type
I reuse this module into another one as follows:我将这个模块重用于另一个模块,如下所示:
module Access_My_type_module { // module-info.java
requires Open_My_type_module;
}
// Business code (for test only in a Main.java class): // 业务代码(仅用于Main.java类中的测试):
Class<Open_My_type_package.My_type> c = Open_My_type_package.My_type.class;
Starting from the following structure:从以下结构开始:
THIRD_PARTY_MODULE >> Open_My_type_module-1.0.jar
src >> main >> java >> com >> X >> Access_My_type_package >> Main.java
src >> main >> java >> module-info.java
Compilation succeeds based the following line:编译成功基于以下行:
javac -d PRODUCTION_SOFTWARE --module-path THIRD_PARTY_MODULE src/main/java/com/X/Access_My_type_package/Main.java src/main/java/module-info.java
Next, before execution, I package my software as follows:接下来,在执行之前,我将我的软件打包如下:
cd PRODUCTION_SOFTWARE
jar --create --verbose --file Access_My_type_module-1.0.jar --main-class com.X.Access_My_type_package.Main *
Packaging DOES NOT seem to « link » Open_My_type_module-1.0.jar in the final executable, but I check the inside of the packaged software:包装似乎并不«链接»Open_My_type_module-1.0.jar在最后的可执行文件,但我查了套装软件的内部:
jar --file=Access_My_type_module-1.0.jar --describe-module
Display (everything seems sound):显示(一切看起来都很好):
Access_My_type_module jar:file://./Access_My_type_module-1.0.jar/!module-info.class
requires Open_My_type_module
requires java.base mandated
contains com.X.Access_My_type_package
main-class com.X.Access_My_type_package.Main
Finally, execution fails with java.lang.NoClassDefFoundError
from:最后,执行失败,
java.lang.NoClassDefFoundError
来自:
java --module-path THIRD_PARTY_MODULE -jar Access_My_type_module-1.0.jar
I believed that --module-path THIRD_PARTY_MODULE
is enough to link Open_My_type_module-1.0.jar at execution time, but I keep the feeling that my packaging command is shaky.我相信
--module-path THIRD_PARTY_MODULE
足以在执行时链接Open_My_type_module-1.0.jar ,但我仍然觉得我的打包命令不稳定。 Beyond, I'm sure I've missed of a key issue about Java 9 modules… HELP WELCOME please!除此之外,我确定我错过了关于 Java 9 模块的一个关键问题……请帮助欢迎!
Solution (below) is inspired from https://sites.google.com/a/athaydes.com/renato-athaydes/posts/guidetojava9-compilejarrun .解决方案(如下)的灵感来自https://sites.google.com/a/athydes.com/renato-athydes/posts/guidetojava9-compilejarrun 。
With Java modules, execution is better controlled using --module
instead of -jar
.对于 Java 模块,使用
--module
而不是-jar
可以更好地控制执行。 So java --module-path THIRD_PARTY_MODULE --module Access_My_type_module
works fine!所以
java --module-path THIRD_PARTY_MODULE --module Access_My_type_module
工作正常! Assumption: Access_My_type_module-1.0.jar
must be located within THIRD_PARTY_MODULE
along with Open_My_type_module-1.0.jar
(for simplicity here).假设:
Access_My_type_module-1.0.jar
必须与Open_My_type_module-1.0.jar
一起位于THIRD_PARTY_MODULE
(此处为简单起见)。 In short, java
finds in the THIRD_PARTY_MODULE
directory all the desired stuff.简而言之,
java
在THIRD_PARTY_MODULE
目录中找到了所有需要的东西。 Please note that --module
required the module name (ie, Access_My_type_module
) and NOT the jar file name!请注意
--module
需要模块名称(即Access_My_type_module
)而不是jar 文件名! Please also note that Access_My_type_module-1.0.jar
manifest has already been set up with a main class at packaging time... if not tell java
which is the main class at execution time.另请注意,
Access_My_type_module-1.0.jar
清单在打包时已经设置了一个主类……如果没有告诉java
在执行时哪个是主类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.