JDK9 最酷的功能之一是jlink,它制作了 JVM 的一个小型优化版本来运行应用程序,这对于在像 docker 这样的容器中运行应用程序非常有用。然而,仅仅传递您拥有的 JAR 文件并获得优化的运行时来运行它并不是很简单。
就像我使用 Gradle 并创建一个 fat jar 文件(所有依赖项都在一个 jar 文件中)一样,我只是想使用这个 jar 文件来为其生成 JVM?有什么解决办法吗?
-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
我已经下载了 jaxb-ri:
\n$ tree -L 1\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docs\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 License.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mod\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 samples\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ThirdPartyLicenseReadme.txt\nRun Code Online (Sandbox Code Playgroud)\n我的java版本是:
\n$ java -version\nopenjdk version "11.0.7" 2020-04-14\nRun Code Online (Sandbox Code Playgroud)\n然而,当我尝试执行时xjc.sh -help,我收到此错误消息:
Java major version: 11\njava.lang.module.FindException: Module java.activation not found, required by com.sun.istack.runtime\n at java.base/java.lang.module.Resolver.findFail(Resolver.java:877)\n at java.base/java.lang.module.Resolver.resolve(Resolver.java:191)\n at java.base/java.lang.module.Resolver.resolve(Resolver.java:140)\n at java.base/java.lang.module.Configuration.resolveAndBind(Configuration.java:315)\n at java.base/java.lang.module.ModuleDescriptor$1.resolveAndBind(ModuleDescriptor.java:2693)\n at java.base/jdk.internal.module.ModuleBootstrap.boot(ModuleBootstrap.java:354)\n at java.base/java.lang.ClassLoader.initializeClassLoaders(ClassLoader.java:211)\n at java.base/java.lang.Thread.initialize(Thread.java:430)\n at java.base/java.lang.Thread.<init>(Thread.java:155)\nRun Code Online (Sandbox Code Playgroud)\n 在为问题执行概念证明时 - JPMS ServiceLoader 对我来说并不像预期的那样工作。
在向模块路径提供 jar 与目标类时,我达到了理解两个模块如何解析的差异的状态。控制台有一个单行差异:
base.service binds user.service file://.../user-service/target/classes/
Run Code Online (Sandbox Code Playgroud)
这实际上意味着什么?在规范或概念草案中无法真正找到该术语的此类参考。
此外,在自动模块解析期间,这种行为何时会有所不同?(参考这个答案)
我最近看过新的Java平台模块系统,该系统提供的功能似乎与Maven在jar文件之间的依赖关系管理方面提供的内容重叠.我想知道这个新的Java功能将如何影响Maven,以及它是否已经集成到Maven或类似工具中,如果是这样,那么什么是hello-world用法示例.
干杯
JDK9将(可能)引入一个模块系统.作为其中的一部分,Java类库将被模块化.
当找不到类时,这会导致异常,因为它们位于未指定为依赖项的模块中.
将使用模块系统创建哪些模块以及它们各自的内容是什么?
或者说不同:给定一个没有加载的类,我如何找到适当的模块作为依赖项?
为了能够将我的Eclipse插件"treezCore"也用作Java9模块,我在src文件夹中创建了一个module-info.java.
此外,我将Plug-in Dependencies从Classpath移动到Modulepath.我可以在插件依赖项中看到一个模块"org.eclipse.swt.3.106.1.v20170926":
但是,我无法在module-info.java中引用该模块.我试过了
require org.eclipse.swt.3.106.1.v20170926;
require org.eclipse.swt;
require swt;
Run Code Online (Sandbox Code Playgroud)
这些选项都没有奏效.Eclipse使用的jar文件\ plugins\org.eclipse.swt_3.106.1.v20170926-0519.jar不包含模块定义,
jar --file org.eclipse.swt_3.106.1.v20170926-0519.jar -d
说无法导出模块描述符.另见
如果我从中下载更新版本的swt.jar
我得到以下有希望的输出:
swt automatic
requires java.base mandated
contains org.eclipse.swt
contains org.eclipse.swt.accessibility
contains org.eclipse.swt.awt
contains org.eclipse.swt.browser
contains org.eclipse.swt.custom
contains org.eclipse.swt.dnd
contains org.eclipse.swt.events
contains org.eclipse.swt.graphics
contains org.eclipse.swt.internal
contains org.eclipse.swt.internal.gdip
contains org.eclipse.swt.internal.image
contains org.eclipse.swt.internal.mozilla
contains org.eclipse.swt.internal.mozilla.init
contains org.eclipse.swt.internal.ole.win32
contains org.eclipse.swt.internal.opengl.win32
contains org.eclipse.swt.internal.webkit
contains org.eclipse.swt.internal.win32
contains org.eclipse.swt.layout
contains org.eclipse.swt.ole.win32
contains org.eclipse.swt.opengl
contains org.eclipse.swt.printing
contains org.eclipse.swt.program
contains org.eclipse.swt.widgets
Run Code Online (Sandbox Code Playgroud)
我也依赖于org.eclipse.jface而无法找到它的单独下载.
=>我真的必须等待使用包含模块定义的新插件版本的Eclipse新版本吗?
或者我可以以某种方式从插件文件夹中引用旧版本的swt,即使它不包含模块定义?我寻找一种简单的方法来定义别名或后备依赖,例如
requires ../plugins/org.eclipse.swt_3.106.1.v20170926-0519.jar as 'org.eclipse.swt' …Run Code Online (Sandbox Code Playgroud) swt eclipse-plugin eclipse-rcp java-platform-module-system java-9
我有一个使用source/target = 1.9/1.9的多模块Gradle Java项目.有两个模块,my.base和my.dependsOnBase.该my.base模块没有其它的依赖:
module my.base {
exports my.base.foo;
exports my.base.bar;
}
Run Code Online (Sandbox Code Playgroud)
所述my.dependsOnBase模块仅具有单一的依赖,这是my.base:
module my.dependsOnBase {
requires my.base;
exports my.dependsOnBase.baz;
}
Run Code Online (Sandbox Code Playgroud)
当我运行$ gradle javadoc它在my.base上工作正常.但是当它到达my.dependsOnBase时,我得到以下错误输出:
/path/to/my $ gradle javadoc
> Task :dependsOnBase:javadoc FAILED
/path/to/my/dependsOnBase/src/main/java/module-info.java:26: error: module not found: my.base
requires my.base;
^
1 error
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':dependsOnBase:javadoc'.
> Javadoc generation failed. Generated Javadoc …Run Code Online (Sandbox Code Playgroud) 我尝试在 Gradle 项目中使用 JUnit 5。compileJava并且compileTestJava都成功,但test失败并显示奇怪的消息Could not execute test class 'module-info'.(来自堆栈跟踪的消息):
> Task :test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/axel/git/utility/build/reports/tests/test/index.html
Run Code Online (Sandbox Code Playgroud)
测试结果文件提示我“ failed to execute tests”,但堆栈跟踪看起来很奇怪。似乎 JUnit 正在尝试运行与我的module-info.java文件对应的类:
org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not execute test class 'module-info'.
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at …Run Code Online (Sandbox Code Playgroud) 使用 Java 11 编译时出现以下错误。
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.xni.parser'
Symbol is declared in module 'java.base' which does not export package 'sun.net.www.protocol.http'
Symbol is declared in module 'java.base' which does not export package 'sun.net.www.protocol.file'
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.util'
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.xni.parser'
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.xni.parser'
Symbol is declared in …Run Code Online (Sandbox Code Playgroud) java-platform-module-system ×10
java ×7
java-11 ×4
java-9 ×4
java-module ×3
gradle ×2
maven ×2
classpath ×1
eclipse-rcp ×1
javadoc ×1
jaxb ×1
jlink ×1
junit ×1
junit5 ×1
kotlin ×1
openjdk-11 ×1
swt ×1