标签: java-platform-module-system

是否可以在Java 9模块中使用不带module-info.class的依赖项

我创建了两个小项目de.app1de.app2,其中Appde.app1使用Testde.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-platform-module-system java-9

11
推荐指数
1
解决办法
4193
查看次数

我可以通过MANIFEST.MF要求Java 9模块吗?

我的Java库应该与Java 8和Java 9兼容.对于使用Java 9运行,我们需要一些Java 9模块.

我知道我可以通过命令行添加它--add-modules.但它是一个库,我无法控制命令行.

是否有一个等价--add-modulesMANIFEST.MF?或者还有其他与Java 8兼容的解决方案吗?

java java-platform-module-system java-9 java-module

11
推荐指数
2
解决办法
3193
查看次数

平台模块之间是否允许循环?

这是模块的模块声明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,对吗?平台模块之间是否允许循环?

java java-platform-module-system java-9

11
推荐指数
1
解决办法
219
查看次数

在哪里使用Java 9放置module-info.java?

我有一个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绑定?

如果我做错了,请告诉我解决这个问题的正确方向.

java osgi java-platform-module-system apache-felix java-9

11
推荐指数
1
解决办法
4356
查看次数

生成模块信息jdeps时缺少依赖项

我正在尝试使用以下命令运行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会找到所有模块而不是手动添加它们.

java java-platform-module-system java-9 jdeps

11
推荐指数
1
解决办法
3385
查看次数

Java Jar MANIFEST 中的多个添加打开

我有一个可执行的 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)

java java-platform-module-system

11
推荐指数
2
解决办法
8056
查看次数

在分离的Java平台模块中使用不同版本的依赖项

我预计可以在myModuleA中使用ie Guava-19,在myModuleB中使用guava-20,因为jigsaw模块有自己的类路径.

假设myModuleA使用Iterators.emptyIterator(); - 在guava-20中删除,myModuleB使用新的静态方法FluentIterable.of(); - 番石榴-19没有.不幸的是,我的测试是否定的.在编译时,它看起来很好.与运行时相反,结果是NoSuchMethodError.意味着,类加载器中的第一个类决定哪个失败.

与底层耦合的封装?我找到了自己的理由.由于传递依赖性会产生与以前相同的问题,因此无法支持它.如果在ModuleA和ModuleB中的签名中发生版本冲突的guava类依赖于它.应该使用哪个班级?

但为什么我们可以通过互联网阅读"拼图 - 模块系统停止类路径地狱"?我们现在有多个较小的"类似路径",但问题相同.这不仅仅是一个问题,而是一个不确定性.

java java-platform-module-system java-9

10
推荐指数
2
解决办法
4531
查看次数

--release不允许从系统模块导出包

我有以下程序:

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.

java javac java-platform-module-system java-9

10
推荐指数
4
解决办法
2803
查看次数

可从多个模块访问的包:&lt;unnamed&gt;

尝试在 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 的一部分。

在此处输入图片说明

在此处输入图片说明

java jmx java-platform-module-system jakarta-ee

10
推荐指数
2
解决办法
1万
查看次数

由于 MultiReleaseException,jdeps 无法打印模块 deps

我们有一个基于 JavaFX 的应用程序,它没有模块化(有原因,涉及遗留库),但我们使用jdeps和构建了一个自定义运行时jlink

\n

我们最近重写了该应用程序并添加了一些新的依赖项,并删除了其他依赖项。现在,正在构建应用程序的脚本在jdeps通话期间突然停止工作。

\n

注意:这种情况发生在 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\n
Run Code Online (Sandbox Code Playgroud)\n

结果总是

\n
Exception 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 javafx java-platform-module-system jdeps java-17

10
推荐指数
1
解决办法
1558
查看次数