我创建3个模块的一个示例应用程序user,dept和account.在我的用户模块中,我有一个主类,并使用以下命令编译我的模块:
javac -d target --module-source-path src $(find -name "*.java")
Run Code Online (Sandbox Code Playgroud)
编译后,执行以下命令运行:
java -p target -m com.user/com.user.info.Launcher
Run Code Online (Sandbox Code Playgroud)
运行java模块后的输出成功.但是当尝试使用jlink成功创建的映像创建运行时映像但模块可执行脚本不存在时.为了创建图像,我使用以下命令:
jlink --module-path $JAVA_HOME/jmods:target --add-modules com.user --output my-app
Run Code Online (Sandbox Code Playgroud)
在,运行时映像,我有bin目录,但这个目录只包含java和keynote脚本.我期待用户主类脚本,以执行我的应用程序.
我的Java版本如下:
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+165)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
在java 9项目中,我想要求vertx.web,这是为模块提供的自动名称io.vertx:vertx-web:3.4.2.仅在运行时,我收到以下错误.
Error occurred during initialization of boot layer
java.lang.module.FindException: Unable to derive module descriptor for /Users/user/.gradle/caches/modules-2/files-2.1/io.vertx/vertx-web/3.4.2/eee42405acff13d37eb2a62256189d419f91aa4d/vertx-web-3.4.2.jar
Caused by: java.lang.module.InvalidModuleDescriptorException: Provider class moduleFactory = io.vertx.groovy.ext.web.VertxPropertiesModuleFactory not in module
Run Code Online (Sandbox Code Playgroud)
似乎vertx-web使用了Groovy扩展模块.这就是文件META-INF/services/org.codehaus.groovy.runtime.ExtensionModule存在的原因.Java9错误地读取此文件以进行服务加载.
是否有任何方法可以忽略此服务文件,因为它在依赖项中,我无法更改它?
我一直在尝试编写 Java 9 模块,但无论我做什么,我都会收到错误“包为空或不存在”。我尝试在线搜索预期的目录布局,并尝试了我能想到的目录布局的每种变体,但没有任何效果。
例如,这是我尝试过的一种布局
bar.foo/module-info.java
module bar.foo {
exports bar.foo;
}
Run Code Online (Sandbox Code Playgroud)
bar.foo/bar/foo/wtf.java
package bar.foo;
public class wtf {
}
Run Code Online (Sandbox Code Playgroud)
但是,编译仍然给出与平常相同的错误。
> javac bar.foo/module-info.java
bar.foo/module-info.java:2: error: package is empty or does not exist: bar.foo
exports bar.foo;
^
1 error
Run Code Online (Sandbox Code Playgroud) 我用Java 9构建了一个Spring Boot应用程序... sourceCompatibility = 9 targetCompatibility = 9 ...并用以下命令启动它:java --module-path lib -m my.app....
Caused by: java.lang.NoClassDefFoundError: java/sql/SQLException
at spring.beans@5.0.2.RELEASE/org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:161)
at spring.boot@2.0.0.M7/org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:436)
... 5 more
Caused by: java.lang.ClassNotFoundException: java.sql.SQLException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 7 more
Run Code Online (Sandbox Code Playgroud)
注意:我已经使用classpath而不是--module-path成功启动了应用程序
编辑:谢谢您的建议!最后,我找到了一个"魔术组合"来启动应用程序.我修改了命令行,从lib中删除了javax.transaction-api-1.2.jar并将其放在类路径上以删除模块java.sql和javax.transaction.api之间的包(javax.transaction.xa)拆分冲突
java --module-path lib --add-modules java.sql,java.instrument,java.xml.bind -cp javax.transaction-api-1.2.jar -m my.app
Run Code Online (Sandbox Code Playgroud) 我目前正在编写一个需要在不同类型的设备上运行的应用程序.我的方法是创建一个"模块化"应用程序,它可以根据操作所需的设备动态加载不同的类.
为了使应用程序易于扩展,我的目标是为其他模块(.jar或.class文件)分配一个特定的路径,使核心程序保持原样.当不同的客户需要不同的模块时(无需为每个模块编译不同的应用程序),这将是至关重要的.
这些模块将实现一个通用接口,而"核心"应用程序可以使用接口上定义的这些方法,让单个实现完成工作.根据需要加载它们的最佳方法是什么?我正在考虑使用URLClassLoader,但我不知道这种方法是否是根据新的模式和Java趋势是最新的,因为我想避免设计糟糕的应用程序和弃用的技术.使用JDK 9制作模块化且易于扩展的应用程序的另一种最佳方法是什么(可以通过将模块文件添加到文件夹来扩展)?
我正在调查使用Jigsaw来减少微服务的占用空间.我必须找到的最后一个依赖项是java.beans.Introspector.
想象一下,当我发现我需要引入整个模块java.desktop时,我会感到惊讶,它包含各种不相关的东西,比如awt,applets,swing等.
这对我来说似乎很疯狂,当然bean内省应该是基本语言的一部分,与UI功能无关.我认为依赖来自Spring Boot的嵌入式Tomcat,所以我不能自己修改它.
问题:模块是您可以访问的最精细的粒度还是有另一种方法来修剪脂肪.
我已添加requires transitive java.activation到我的module-info.java,但java-10正在给我一个编译器警告module-info.java: module java.activation has been deprecated and marked for removal,尽管我已经在我的Maven 上添加了对com.sun.activation:javax.activation:1.2.0(Automatic-Module-Name: java.activation)的依赖pom.xml.
我可以通过添加@SuppressWarnings("removal")到我的模块声明来解决这个问题,但我从不喜欢抑制我可以修复的警告.还有什么我可以做的事情来与编译器沟通我打算依赖第三方jar而不是该模块的内置/弃用版本?
非常感谢!
根据https://www.oracle.com/corporate/features/understanding-java-9-modules.html,Java Module 系统引入了以下指令:
每个指令对使用反射访问内部成员的外部模块有何影响(如果有)?
例如,是否exports <package>允许外部模块使用反射访问导出包的所有public, protected,成员?private其他指令又如何呢?
环境: Win10、Oracle JDK 9、Eclipse、jlink、javapackager
上下文:我正在尝试生成一个可执行文件,其中包含javapackager
使用 制作的 java 自定义运行时映像jlink,并阅读javapackager 文档。不可安装。
Jlink 创建了一个 zip 文件,其中包含我所有的 java 类文件和封装的资源(这意味着我无法从系统资源管理器访问它们)+ 自定义 jre。它带有一个 .bat 启动器来运行该应用程序。一切正常。
Walkthrow:第一,我发现OpenJDK14 中jpackage有一个OpenJDK 实用程序可以使 java 模块化应用程序可执行,该实用程序仍在开发中。我没有找到任何方法来处理它。后来我研究了 Inno Setup,但它不能满足我的需求(因为我不需要安装程序)后来我发现从 Oracle JDK 8 开始,就有了为每个平台(max、linux、windows..)生成可运行文件的工具。javapackager
我无法使 javapackager 工作。这是我在 Windows cmd 上执行的命令的各种尝试之一。
javapackager
-deploy
-native exe
--add-modules myModule,javafx.graphics,javafx.controls
--module-path "C:\path\to\javafx-jmods;C:\path\to\target\classes;C:\path\to\more\jmods"
-outdir "C:\myApp"
-outfile MyApp
-appclass myPackage.MyApp
-name "MyApp"
Run Code Online (Sandbox Code Playgroud)
使用前面的命令我收到错误:
Error: No application jars foun
Run Code Online (Sandbox Code Playgroud)
因此,我意识到我将 -deploy 命令及其选项与 -createjar 命令及其选项混合在一起。
有人可以解释如何使用 javapackager 生成 .exe 吗? …
我的问题:在构建最小的 JRE 时,如何确保没有缺少所需的模块?
为了说明这个问题,这里有一个例子,我想为我的项目构建一个最小的 JRE。在此示例中,我们假设 logback 是我唯一的依赖项。
我运行以下命令来查看需要哪些模块:
$ jar --file=logback-core-1.2.3.jar --describe-module
No module descriptor found. Derived automatic module.
logback.core@1.2.3 automatic
requires java.base mandated
contains ch.qos.logback.core
contains ch.qos.logback.core.boolex
etc. (there are more "contains ch.qos.logback.XXX" lines)
Run Code Online (Sandbox Code Playgroud)
看来我只需要该java.base模块,并相应地构建了我的最小 JRE:
jlink --output jre-min --add-modules java.base
Run Code Online (Sandbox Code Playgroud)
然而,当使用最小的 JRE 运行项目时,我在使用 logback 的电子邮件记录器时遇到了问题(通过 TLS 的格式错误的电子邮件)。经过反复试验,我发现jdk.crypto.cryptoki还需要该模块:
jlink --output jre-min --add-modules java.base,jdk.crypto.cryptoki
Run Code Online (Sandbox Code Playgroud)
现在我的项目运行良好。我怎样才能避免试错步骤?
java-module ×10
java ×9
java-9 ×9
jlink ×2
module-info ×2
groovy ×1
java-10 ×1
java-platform-module-system ×1
javapackager ×1
reflection ×1
spring ×1
spring-boot ×1
vert.x ×1
windows ×1