尝试在 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) 我开始学习 jigsaw java-9 功能并阅读了一些文章/视频。
我无法理解可选依赖项的概念(requires static)
引自文章:
当一个模块需要针对另一个模块的类型进行编译但不想在运行时依赖它时,它可以使用 requires static 子句。如果 foo 需要 static bar,则模块系统在编译和运行时的行为会有所不同:
在编译时, bar 必须存在,否则会出错。在编译期间 bar 可由 foo 读取。
在运行时, bar 可能不存在,这不会导致错误或警告。如果它存在,它可以被 foo 读取。
所以我想知道几件事:
在编译时使模块依赖于另一个模块而不是运行时的原因是什么?任何例子?像龙目岛这样的乐器?
java之前的java-9中可选依赖项的任何类似物?
我找到了另一种解释:引自文章:
有时我们编写引用另一个模块的代码,但我们库的用户永远不想使用。
例如,我们可能会编写一个实用程序函数,当另一个日志模块存在时,它可以漂亮地打印我们的内部状态。但是,并非我们库的每个使用者都需要此功能,并且他们不想包含额外的日志记录库。
在这些情况下,我们希望使用可选的依赖项。通过使用 requires 静态指令,我们创建了一个仅编译时依赖:
module my.module {
requires static module.name;
}
Run Code Online (Sandbox Code Playgroud)
但对我来说完全不清楚。谁能用简单的方式解释一下?
在尝试移植 Swing 代码以与 Java 模块系统兼容时,我在尝试替换SwingUtilities3.setDelegateRepaintManager.
我有一个组件,当它的任何子级请求重绘时,我需要转换该区域(特别是这试图为org.pbjar.jxlayer.plaf.ext.TransformUI知道这一点的任何人移植代码)。目前,这是通过设置组件的委托重绘管理器并拦截对 的调用来完成的addDirtyRegion。
现在使用 Java 9,这样做的方法不再作为公共 api 可用。原始代码提供了一种替代方法,该方法最初用于SwingUtilities3.setDelegateRepaintManager不可用的旧版 Java ,它只是用RepaintManager委托实现替换了全局。如果组件包含在需要转换的实际组件中,它会检查每个调用。然而,该解决方案丢弃了 的所有内部数据RepaintManager并导致在调整框架大小时严重闪烁。
这是当前使用的代码的删节版:
SwingUtilities3.setDelegateRepaintManager(component, new TransformRepaintManger());
...
class TransformRepaintManager extends RepaintManager {
@Override
public void addDirtyRegion(JComponent c, int x, int y, int w, int h) {
if (c.isShowing()) {
Point point = c.getLocationOnScreen();
SwingUtilities.convertPointFromScreen(point, c);
Rectangle transformPortRegion = transform(new Rectangle(x + point.x, y + point.y, w, h), c);
RepaintManager.currentManager(c)
.addDirtyRegion(c,
transformPortRegion.x, transformPortRegion.y,
transformPortRegion.width, transformPortRegion.height);
} …Run Code Online (Sandbox Code Playgroud) java swing java-platform-module-system swingutilities repaintmanager
我目前正在测试将现有应用程序迁移到Jigsaw Modules.我的一个模块使用ElasticSearch及其Groovy插件.
不幸的是,他们共享一个拆分包,所以mvn install给我:
x从lang.groovy和elasticsearch读取包org.elasticsearch.script.groovy
对于描述符中的每个必需模块,其中x是每个模块的名称.
我假设一个较新的elasticsearch版本将在Java 9最终版本的时候取消拆分包,但是通常有一种方法来处理遗留依赖项中的拆分包吗?
我希望能够在类路径而不是模块路径上有那些,但是在邮件列表上阅读这个对话后,似乎没有办法告诉Maven编译器这样做.
maven 3.3.9 - maven-compiler-plugin 3.6.0 - jdk9-ea + 149 - elasticsearch 2.3.3
maven java-platform-module-system maven-compiler-plugin java-9
我面临的问题是jlink的服务绑定选项链接了许多模块,似乎没有必要.省略服务绑定选项时,不链接这些模块.
问题:
我的应用程序:应用程序是一个简单的服务,由一个接口,一个提供者和一个使用者组成,每个服务都打包到一个单独的模块中,称为modService,modProvider,modConsumer(详见下文).
操作系统:Windows 10
Jlink 没有 --bind-services产生预期的结果:
jlink --module-path "mods;%JAVA_HOME%\jmods"
--add-modules modConsumer
--output myRuntime
java --list-modules
java.base@9
modConsumer
modService
Run Code Online (Sandbox Code Playgroud)
当应用该--bind-services选项时,我希望另外应该链接模块modProvider.但是,看看会发生什么(三个自定义模块在最后):
jlink --module-path "mods;%JAVA_HOME%\jmods"
--bind-services
--add-modules modConsumer
--output myRuntime
java --list-modules
java.base@9
java.compiler@9
java.datatransfer@9
java.desktop@9
java.logging@9
java.management@9
java.management.rmi@9
java.naming@9
java.prefs@9
java.rmi@9
java.scripting@9
java.security.jgss@9
java.security.sasl@9
java.smartcardio@9
java.xml@9
java.xml.crypto@9
jdk.accessibility@9
jdk.charsets@9
jdk.compiler@9
jdk.crypto.cryptoki@9
jdk.crypto.ec@9
jdk.crypto.mscapi@9
jdk.deploy@9
jdk.dynalink@9
jdk.internal.opt@9
jdk.jartool@9
jdk.javadoc@9
jdk.jdeps@9
jdk.jfr@9
jdk.jlink@9
jdk.localedata@9
jdk.management@9
jdk.management.cmm@9
jdk.management.jfr@9 …Run Code Online (Sandbox Code Playgroud) 具有依赖于自动模块的显式模块化项目,例如,依赖于java.activation。仍然可以使用jlink吗?
请参阅以下module-info.java:
module hello {
requires java.activation;
}
Run Code Online (Sandbox Code Playgroud)
然后,Jlink无法添加模块:
$ jlink --module-path target/modules --add-modules hello --output target/jlink
Error: automatic module cannot be used with jlink: java.activation from file:///C:/Development/jlinkExample/target/modules/javax.activation-api-1.2.0.jar
Run Code Online (Sandbox Code Playgroud)
根据我的理解,自动模块无论如何都将包含整个类路径,所以我猜想用jlink创建运行时映像没有好处吗?另请参阅:什么是自动模块?
有没有可能解决这个问题的方法,也许为那些依赖项生成一个模块信息?
在我的 .NET 中project,我试图在该工具生成的文档文件中包含指向模块化 Java 库 ( Caesar ) 的链接javadoc。跑步:
mvn clean install
Run Code Online (Sandbox Code Playgroud)
构建没有链接到外部库的文档。
我的配置:
project
|-- pom.xml
`-- src
`-- main
`-- java
|-- foo.bar.project
| `-- foo
| `-- bar
| `-- project
| `-- Foo.java
`-- module-info.java
Run Code Online (Sandbox Code Playgroud)
Foo.java:
package foo.bar.project;
import com.github.glusk.caesar.Bytes;
public class Foo {
public static Bytes bytes;
}
Run Code Online (Sandbox Code Playgroud)
module-info.java:
module foo.bar.project {
requires com.github.glusk.caesar;
}
Run Code Online (Sandbox Code Playgroud)
pom.xml:
package foo.bar.project;
import com.github.glusk.caesar.Bytes;
public class Foo {
public static Bytes bytes; …Run Code Online (Sandbox Code Playgroud) java javadoc maven java-platform-module-system maven-javadoc-plugin
当我使用 JDK 17 运行此测试时出现此错误:
java.lang.reflect.InaccessibleObjectException: Unable to make field final transient java.lang.Class java.util.EnumSet.elementType accessible: module java.base does not "opens java.util" to unnamed module @60addb54
Run Code Online (Sandbox Code Playgroud)
@Test
public void testThatDeepCopyCopiesEmptySet() {
SetOfEnumUserType setOfEnumUserType = createSetOfEnumUserType();
EnumSet<PaymentMethodType> src = EnumSet.noneOf(PaymentMethodType.class);
EnumSet<?> dest = (EnumSet<?>) setOfEnumUserType.deepCopy(src);
assertThat(dest, (is(src)));
assertThat(dest, not(isSameInstanceAs(src)));
Class<?> srcType = (Class<?>) ReflectionTestUtils.getField(src, "elementType");
Class<?> destType = (Class<?>) ReflectionTestUtils.getField(dest, "elementType");
assertThat(srcType, (is(destType)));
}
Run Code Online (Sandbox Code Playgroud)
我尝试根据其他答案将其添加到我的 pom.xml 中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<arg>--add-opens java.base/java.lang=ALL-UNNAMED</arg>
<arg>--add-opens java.base/java.util=ALL-UNNAMED</arg>
</compilerArgs>
</configuration>
</plugin> …Run Code Online (Sandbox Code Playgroud) 我有一个公开可用的 Java 8 桌面应用程序,其中包含 MSI 安装程序,我想将其更新到 Java 17。
目前的用户体验是这样的:
application.exe这是一个基本上运行的垫片java jar application.jar。我很难理解的是用户应该在 Java 9+ 世界中安装什么。例如,如果我将用户发送到: https: //www.oracle.com/java/technologies/downloads/,他们会收到下载 Java 开发工具包的欢迎,这对用户来说安装起来是一件令人困惑的事情(“这是对的吗?我不想开发东西??”)。
此外,当你登陆http://java.com时,它会说“如果你被要求下载 java,很可能就是这个”,这意味着如果你发布应用程序,你应该使用 Java 8(并且忘记 JavaFX 灾难)是 OpenJDK 11 之前的版本,并且只需使用 Orcale Java)...
我的印象是,在 Java 9 之后,Jigsaw 的承诺是构建一个包含本机运行时和 jar 的包,所有这些都整齐地捆绑在一起,以便最终用户必须安装 JVM 的日子结束了。然而在网上搜索,我发现 Gradle 或 IntelliJ(或 Eclipse)不支持这一点,所以这看起来有点像一个死的白日梦?
如果我想发布 Java 17 应用程序,用户是否需要安装 JDK?如果没有,我该如何打包和运送我的申请?
java-platform-module-system ×10
java ×9
java-9 ×3
maven ×3
java-17 ×2
jlink ×2
jakarta-ee ×1
java-module ×1
javadoc ×1
javafx ×1
jdeps ×1
jmx ×1
release ×1
swing ×1