简体   繁体   English

Java 9 第三方模块«链接»,如何?,何时? -> java.lang.NoClassDefFoundError

[英]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.简而言之, javaTHIRD_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM