我创建了两个小项目de.app1和de.app2,其中App从de.app1使用Test从de.app2.
??? de.app1
? ??? de
? ? ??? app
? ? ??? App.java
? ??? module-info.java
??? de.app2
??? de
??? test
??? Test.java
Run Code Online (Sandbox Code Playgroud)
第一个项目中的module-info.java只包含module de.app1 {}
我编译了第二个项目并创建了一个jar文件:
javac de/test/Test.java
jar cf app2.jar de/test/Test.class
Run Code Online (Sandbox Code Playgroud)
然后尝试编译第一个项目,如下所示:
javac -cp ../de.app2/app2.jar de/app/App.java module-info.java
Run Code Online (Sandbox Code Playgroud)
失败,因为Test无法找到.当我在没有module-info.java的情况下编译项目时,一切正常.
是否有可能在Java 9模块中使用不是Java 9模块的jar中的类?特别是对于依赖第三方项目的项目(例如apache-commons,......),我认为需要这样的东西.
我的Java库应该与Java 8和Java 9兼容.对于使用Java 9运行,我们需要一些Java 9模块.
我知道我可以通过命令行添加它--add-modules.但它是一个库,我无法控制命令行.
是否有一个等价--add-modules的MANIFEST.MF?或者还有其他与Java 8兼容的解决方案吗?
这是模块的模块声明java.rmi:
module java.rmi {
requires java.base;
requires java.logging;
exports java.rmi.activation;
exports com.sun.rmi.rmid to java.base; // <-- cycle
...
}
Run Code Online (Sandbox Code Playgroud)
那么,java.rmi和之间存在循环依赖关系java.base,对吗?平台模块之间是否允许循环?
我有一个OSGI应用程序,我有大约30个捆绑(jar文件).今天我决定看看它是如何工作的/如果它适用于Java 9.
所以我开始申请并得到了
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.felix.framework.util.SecureAction (file:/home/.../jar/org.apache.felix.framework-5.4.0.jar) to method java.net.URLClassLoader.addURL(java.net.URL)
WARNING: Please consider reporting this to the maintainers of org.apache.felix.framework.util.SecureAction
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Run Code Online (Sandbox Code Playgroud)
经过一些阅读后,我添加了命令行选项
--add-exports java.base/java.net=org.apache.felix.framework
Run Code Online (Sandbox Code Playgroud)
并使用以下内容创建文件module-info.java:
module org.apache.felix.framework { }
Run Code Online (Sandbox Code Playgroud)
我有两个问题.我应该把这个module-info.java放在哪里让jvm读取它?我该如何将这个模块信息与org.apache.felix.framework-5.4.0.jar文件/ bundle/jar绑定?
如果我做错了,请告诉我解决这个问题的正确方向.
我正在尝试使用以下命令运行jdeps:
jdeps --module-path modules --generate-module-info out com.demo.market.jar
Run Code Online (Sandbox Code Playgroud)
我com.demo.market.jar取决于应用程序模块和自动模块.我把所有依赖项放在'modules'文件夹中,但是我收到了一个错误:
Error: missing dependencies
com.demo.market.platform.MarketPlace -> com.demo.client.wholesale.Client not found
com.demo.market.platform.MarketPlace -> com.demo.product.api.Product not found
com.demo.market.platform.MarketPlace -> com.demo.product.laptop.Laptop not found
com.demo.market.collector.ProductsCollector -> com.demo.logistic.DeliveryService not found
com.demo.market.collector.ProductsCollector -> com.demo.product.api.Product not found
Run Code Online (Sandbox Code Playgroud)
但是当我添加--add-modules它工作正常.
jdeps --module-path modules --add-modules com.demo.client,com.demo.product,com.demo.logistic --generate-module-info out com.demo.market.jar
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我认为jdeps会找到所有模块而不是手动添加它们.
我有一个可执行的 Jar,它使用反射来访问一些 java 内部(实际上我正在着色一些第三方库,如 Netty、DNSJava...)
我看到将此条目添加到 Jar 的 MANIFEST 中
Add-Opens: java.base/sun.net.dns
Run Code Online (Sandbox Code Playgroud)
解决了我的第一个问题:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.xbill.DNS.ResolverConfig (file:/home/diennea.lan/enrico.olivelli/dev/magnews/magnews.installer/target/magnews-24.05-SNAPSHOT.dev-b199bacf8f2-noci-installer.jar) to method sun.net.dns.ResolverConfiguration.open()
WARNING: Please consider reporting this to the maintainers of org.xbill.DNS.ResolverConfig
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Run Code Online (Sandbox Code Playgroud)
但现在我有第二个警告:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.postgresql.jdbc.TimestampUtils …Run Code Online (Sandbox Code Playgroud) 我预计可以在myModuleA中使用ie Guava-19,在myModuleB中使用guava-20,因为jigsaw模块有自己的类路径.
假设myModuleA使用Iterators.emptyIterator(); - 在guava-20中删除,myModuleB使用新的静态方法FluentIterable.of(); - 番石榴-19没有.不幸的是,我的测试是否定的.在编译时,它看起来很好.与运行时相反,结果是NoSuchMethodError.意味着,类加载器中的第一个类决定哪个失败.
与底层耦合的封装?我找到了自己的理由.由于传递依赖性会产生与以前相同的问题,因此无法支持它.如果在ModuleA和ModuleB中的签名中发生版本冲突的guava类依赖于它.应该使用哪个班级?
但为什么我们可以通过互联网阅读"拼图 - 模块系统停止类路径地狱"?我们现在有多个较小的"类似路径",但问题相同.这不仅仅是一个问题,而是一个不确定性.
我有以下程序:
module-info.java
module a {
}
Run Code Online (Sandbox Code Playgroud)
Main.java
public class Main {
public static void main(String[] args) {
System.out.println(sun.nio.ByteBuffered.class);
}
}
Run Code Online (Sandbox Code Playgroud)
该程序成功编译--add-exports选项:
> javac --add-exports java.base/sun.nio=a module-info.java Main.java
Run Code Online (Sandbox Code Playgroud)
但是,当我添加--release参数时,它会失败:
> javac --add-exports java.base/sun.nio=a --release 9 module-info.java Main.java
error: exporting a package from system module java.base is not allowed with --release
1 error
Run Code Online (Sandbox Code Playgroud)
基本上,这两个命令是等效的.那么为什么后者被禁止呢?
此外,由于IDEA将--release参数传递给javac,如果我的项目需要内部API,这使得IDEA的开发变得不可能.
我正在使用JDK 9 + 178.
尝试在 JMX 控制台中注册 MBean 时,我收到以下错误消息:
The package javax.management is accessible from more than one module: <unnamed>, java.management
Run Code Online (Sandbox Code Playgroud)
我正在使用 Eclipse,但module-info.java我的项目结构中没有文件。
当我评论我对 Java EE API 的依赖时,错误消失了,但javax.management包不是 JAR 的一部分。
我们有一个基于 JavaFX 的应用程序,它没有模块化(有原因,涉及遗留库),但我们使用jdeps和构建了一个自定义运行时jlink。
我们最近重写了该应用程序并添加了一些新的依赖项,并删除了其他依赖项。现在,正在构建应用程序的脚本在jdeps通话期间突然停止工作。
注意:这种情况发生在 Linux \xe2\x80\x93 上,我尚未测试其他操作系统,但我不期望出现另一个结果。
\n当脚本调用时
\n~/path/to/jdk/bin/jdeps -q --multi-release 11 --ignore-missing-deps --print-module-deps --class-path ~/path/to/app/target/package/libs/* target/classes/ch/cnlab/uxtest/MainKt.class\nRun Code Online (Sandbox Code Playgroud)\n结果总是
\nException in thread "main" java.lang.Error: java.util.concurrent.ExecutionException: com.sun.tools.jdeps.MultiReleaseException\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.waitForTasksCompleted(DependencyFinder.java:271)\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.parse(DependencyFinder.java:133)\n at jdk.jdeps/com.sun.tools.jdeps.DepsAnalyzer.transitiveArchiveDeps(DepsAnalyzer.java:217)\n at jdk.jdeps/com.sun.tools.jdeps.DepsAnalyzer.run(DepsAnalyzer.java:138)\n at jdk.jdeps/com.sun.tools.jdeps.ModuleExportsAnalyzer.run(ModuleExportsAnalyzer.java:74)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask$ListModuleDeps.run(JdepsTask.java:1047)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:574)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)\n at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)\nCaused by: java.util.concurrent.ExecutionException: com.sun.tools.jdeps.MultiReleaseException\n at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)\n at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.waitForTasksCompleted(DependencyFinder.java:267)\n ... 8 more\nCaused by: com.sun.tools.jdeps.MultiReleaseException\n at jdk.jdeps/com.sun.tools.jdeps.VersionHelper.add(VersionHelper.java:62)\n at jdk.jdeps/com.sun.tools.jdeps.ClassFileReader$JarFileReader.readClassFile(ClassFileReader.java:360)\n at jdk.jdeps/com.sun.tools.jdeps.ClassFileReader$JarFileIterator.hasNext(ClassFileReader.java:402)\n at …Run Code Online (Sandbox Code Playgroud) java ×10
java-platform-module-system ×10
java-9 ×7
jdeps ×2
apache-felix ×1
jakarta-ee ×1
java-17 ×1
java-module ×1
javac ×1
javafx ×1
jmx ×1
osgi ×1