我正在将 java 项目转换为使用模块。我的模块之一依赖于hamcrest库,它需要 jar 文件hamcrest.core和hamcrest.library. 这两个jar文件都有org.hamcrestpackage.json。因此,当我的模块想要将这两个 jar 视为自动模块时,它会失败,因为模块路径中的两个模块不能具有相同名称的包。我查了很多资料,在 stackoverflow 上找到了一些相关的东西。如果我不想重建这些依赖项,我似乎有两个合理的选择:
这是我的问题:
提前致谢
-Xbootclasspath/p:path我正在尝试在 Java 11 中做同样的事情,这些事情可以在 java 9 之前的版本中完成。
作为一个简单的示例,我修改了其中一种valueOf方法java.lang.Integer并使用以下方法编译了该项目:
javac --module-source-path=src/java.base --patch-module java.base=src/java.base -d mods $(find src -name '*.java')
然后我使用以下命令运行了一个简单的示例:
java --patch-module java.base=<pathToMyModifiedJavaBaseClasses> -p lib -m my.moduleA/my.moduleA.Main
这很有效,我看到显示的修改(我从 中所做的简单打印valueOf)。
然而,当我尝试做同样的事情时,java.lang.ClassLoader执行程序时出现以下错误(编译有效):
Error occurred during initialization of boot layer
java.lang.LinkageError: loader 'bootstrap' attempted duplicate class definition for java.lang.invoke.SimpleMethodHandle.
我什至不需要进行更改java.lang.ClassLoader。我的补丁文件夹中该类的绝对存在似乎引发了此错误。(我只想在类的底部添加一个字段)
ClassLoader注意:我只是认为当使用 Eclipse 编译该类时它可以工作。我知道的少数差异之一是 Eclipse 编译器似乎尚未遵循JEP 280。invokedynamic但是字节码中也有指令javac,所以我怀疑这就是问题所在。
java classpath java-platform-module-system java-module java-11
我想从 JAR 库中获取一个图像到我的项目中。
<graphic>
<ImageView>
<Image url="@/toolbarButtonGraphics/general/TipOfTheDay24.gif"/>
</ImageView>
</graphic>
Run Code Online (Sandbox Code Playgroud)
我已将该库添加到我的模块中,它似乎是正确的,但编译器抛出一个错误: 启动层初始化期间发生错误 java.lang.module.FindException:无法为filepath.jar派生模块描述符 导致:java .lang.IllegalArgumentException:jlfgr.1.0:无效的模块名称:“1”不是 Java 标识符。这是我的模块信息文件:
requires javafx.fxml;
requires javafx.controls;
opens sample;
Run Code Online (Sandbox Code Playgroud) 编辑 - 这已解决 - 问题已通过设置解决:“设置 -> 构建、执行、部署 - Java 编译器 -> 项目字节码版本:9”
我正在关注https://www.logicbig.com/tutorials/core-java-tutorial/modules/getting-started-in-intellij.html 上的示例/教程
这不是一个 Maven 项目。我已在项目结构中将源级别设置为 9,例如
我已将项目级别设置为 9:
尝试构建/运行项目的主类时,我收到“错误:(3, 4) java:-source 8 中不支持模块(使用 -source 9 或更高版本来启用模块)”错误。
是的,我已经看到Intellij IDEA 2018.1 Jdk10 无法运行没有回答的测试。
我刚刚将 Intellij 更新到 2019.2.4,但问题仍然存在。我正在使用 SDK 11。如何解决这个问题?谢谢。
编辑:运行/调试配置选项:
编辑:错误:
编辑:平台 SDK:
编辑:依赖项面板:
FWIW,iml 文件的内容显示语言级别 9:
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_9" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry …Run Code Online (Sandbox Code Playgroud) 请任何人解释一下为什么允许导入模块描述符文件?
模块描述符文件中的语句的用途是什么import。
import java.util.*;
module superman {
}
Run Code Online (Sandbox Code Playgroud) 我有两个罐子。一种提供服务接口和服务加载类,另一种提供该服务的实现。
在 jdk8 中运行时效果很好,但service type not accessible to unnamed module @3754a4bf在 jdk9 或更高版本上运行时出现错误。
我将这两个 jar 迁移到了一个模块基础 jar,并且在 >= jdk9 上运行时效果很好,但由于类文件版本错误,在 jdk8 上运行失败。
所以,我在 java 8 或 9 中使用 java serivceloader api 没有问题。
我知道https://blog.codefx.org/tools/multi-release-jars-multiple-java-versions/,但我想避免使构建过程变得更加复杂。构建已经涉及类重定位和其他内容。
我的问题:有没有办法使用 java serviceloading api 使用在 jdk8 和 >=jdk9 上运行的相同 jar ?
我一直在开发带有基于插件的系统的软件,用户可以在其中编写自己的插件。我对 JMPS 很陌生,但我想使用 JMPS 而不是 OSGi 来实现它。制作了一个单独的 API 模块,甚至创建了一个测试插件。
插件以文件名“someplugin.jar”存储在目录中。
如何在运行时加载所有这些 jar(它们都不是自动模块,而是使用 module-info.class 定义良好的模块)?我想在运行时动态加载它们的原因是用户可以选择更改目录以搜索插件,并且无需重新启动应用程序即可更改它。
在为问题执行概念证明时 - JPMS ServiceLoader 对我来说并不像预期的那样工作。
在向模块路径提供 jar 与目标类时,我达到了理解两个模块如何解析的差异的状态。控制台有一个单行差异:
base.service binds user.service file://.../user-service/target/classes/
Run Code Online (Sandbox Code Playgroud)
这实际上意味着什么?在规范或概念草案中无法真正找到该术语的此类参考。
此外,在自动模块解析期间,这种行为何时会有所不同?(参考这个答案)
我已经被这个错误困扰了几天了。我已经用谷歌搜索了它,并以各种形式尝试了至少十几种不同的建议解决方案......
我的项目运行良好,直到我尝试使用一个名为MonacoFX的特定库,根据 GitHub 页面,该库是用 Java 13 开发的(我在这个项目中使用 Java 16.0.1)。该库的文档非常简单,您可以像使用大多数库一样实例化该库,然后只需使用它即可。但是,一旦我尝试实例化它,我就会在运行时收到此错误:
Exception in thread "JavaFX Application Thread"
java.lang.IllegalAccessError: superclass access check failed:
class com.sun.javafx.sg.prism.web.NGWebView (in unnamed module @0x1937acaf)
cannot access class com.sun.javafx.sg.prism.NGGroup (in module javafx.graphics)
because module javafx.graphics does not export
com.sun.javafx.sg.prism to unnamed module @0x1937acaf
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at eu.mihosoft.monacofx@0.0.7/eu.mihosoft.monacofx.MonacoFX.<init>(MonacoFX.java:49)
at com.dustinredmond.newgistfx/com.dustinredmond.newgistfx.data.GistFile.<init>(GistFile.java:28)
at com.dustinredmond.newgistfx/com.dustinredmond.newgistfx.data.GistObject.process(GistObject.java:113)
at com.dustinredmond.newgistfx/com.dustinredmond.newgistfx.data.GistObject.<init>(GistObject.java:27)
at com.dustinredmond.newgistfx/com.dustinredmond.newgistfx.github.GitHubApi.setGitHub(GitHubApi.java:31)
at com.dustinredmond.newgistfx/com.dustinredmond.newgistfx.ui.LoginWindowController.authenticate(LoginWindowController.java:39)
at com.dustinredmond.newgistfx/com.dustinredmond.newgistfx.ui.LoginWindow.lambda$new$1(LoginWindow.java:57)
at …Run Code Online (Sandbox Code Playgroud) 我正在转换现有的 Java 库以使用 module-info.java。我广泛使用 Lombok 和泛型。当我运行“mvn package”时,我收到大量遵循以下模式的错误:
[ERROR] /projects/app/src/main/java/com/whatever/app/server/handlers/HandlerCreateForumPost.java:[116,13] cannot find symbol
[ERROR] symbol: method <com.whatever.app.common.messages.CreateForumPostResults>builder()
[ERROR] location: class com.whatever.app.common.Response
Run Code Online (Sandbox Code Playgroud)
导致错误的语句是:
return Response
.<CreateForumPostResults>builder()
.success(true)
.requestID(context.getRequestID())
.results(
CreateForumPostResults
.builder()
.id(forumPostID)
.build()
)
.build();
Run Code Online (Sandbox Code Playgroud)
错误中报告的第 116 行是“.builder()”。
Response 类位于 com.whatever.app.common 中,定义为:
package com.whatever.app.common;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import lombok.extern.jackson.Jacksonized;
@SuperBuilder
@Jacksonized
@Getter
@Setter
public class Response<T extends Response.Results> {
boolean success;
String message;
String requestID;
T results;
@SuperBuilder
@Jacksonized
@Getter
@Setter
public static class Results {
}
}
Run Code Online (Sandbox Code Playgroud)
CreateForumPostResults …
java ×10
java-module ×10
java-11 ×2
java-9 ×2
java-platform-module-system ×2
javafx ×2
module-info ×2
classpath ×1
fxml ×1
hamcrest ×1
lombok ×1
maven ×1