- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建一个模块化的可执行 jar 文件,它可以使用 java -p <jar file> -m <module>
运行在 Java 9.0.1 上。
这在使用 jar cfe test.jar test.Main -C classes/ .
创建 jar 时按预期工作, 但抛出 module test does not have a MainClass attribute, use -m <module>/<main-class>
使用 mvn package
生成时和 mvn assembly:single
.
这些 Maven 生成的 jar 仍然适用于 java -p test.jar -m test/test.Main
,并且所有 jar 都在类路径上使用 java -jar test.jar
.
我用 jar xf test.jar
检查了 jar 内容,发现除了 list (见下文)外, jar 完全相同:
Manifest-Version: 1.0
Created-By: 9.0.1 (Oracle Corporation)
Main-Class: test.Main
和
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: testuser
Build-Jdk: 9.0.1
Main-Class: test.Main
值得注意的是,仍然无法使用 java -p test.jar -m test
指定工作 list 时:
$ jar cfm test.jar test-contents/META-INF/MANIFEST.MF -C classes/ .
$ java -p test.jar -m test
module test does not have a MainClass attribute, use -m <module>/<main-class>
编辑:具有预期行为的 repo :https://github.com/deontologic/test
最佳答案
虽然我在 jar
tool 中找不到这个准确的文档,但 jmod
tool定义好一点。
--main-class class-name
Specifies main class to record in the module-info.class file.
我可以进一步查看 JDK 代码,执行不同命令时的行为似乎与 ModuleDescriptor.mainClass()
的 mainClass
属性有关.
因为在用--main-class
标志打包jar时,模块描述符中的条目应该被设置为执行模块而不指定主类的完全限定名称在执行期间。
另一方面,这不是真的using the maven jar creation并且可能会在您发现的 future 升级中得到修复。
更多关于为什么以下工作:
java -jar test-1.0.0-SNAPSHOT-jar-with-dependencies.jar
如果指定了 -jar
选项,那么它的参数是包含应用程序类和资源文件的 JAR 文件的名称。启动类必须由其 list 文件中的Main-Class
list header 指示(META-INF/MANIFEST.MF
)
很明显,为什么指定完全限定名称的作用如下:
java -p target/test-1.0.0-SNAPSHOT-jar-with-dependencies.jar -m test/test.Main
关于java - JPMS/Jigsaw 在模块中缺少主类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47878694/
我有一个非常基本的 JavaFX 应用程序,如果应用程序类不是主类,它可以完美运行: import javafx.application.Application; import javafx.fxml
我以为JPMS不支持模块版本。但是,当我执行 java --list-modules 时,我得到以下输出: java.activation@9 java.base@9 java.compiler@9
JPMS ServiceLoader 无法正常工作。 我正在尝试提供一个桌面程序作为可执行jar,带有默认服务,可以由个人用户重载。用户提供他们自己的服务类,并在命令行上提供他们的名字作为参数。 服务
在介绍 JPMS 服务时,Java 语言规范第 7.7.4 节指出“服务类型必须是类类型、接口(interface)类型或注解类型”。 我很难看到允许注释的意义。我的理解是,JPMS 的服务概念是我们
假设我们有 JPMS 模块 - A、B、C 等。A 定义了一些服务a.spi.SomeService 和所有模块都实现了此服务。例如,模块 B 具有此服务 b.spi.SomeServiceImpl
我正在尝试创建一个模块化的可执行 jar 文件,它可以使用 java -p -m 运行在 Java 9.0.1 上。 这在使用 jar cfe test.jar test.Main -C clas
如何列出所有模块的所有(!)JPMS 服务。我的意思是我需要当前运行 JVM 时可以使用的所有服务的列表。我在互联网上搜索过,但仍然找不到方法。 最佳答案 没有这样的命令,但你可以在命令行中组合一些东
Java 的包管理系统对我来说总是简单而有效。它被 JDK 本身大量使用。我们一直在用它来模仿命名空间和模块的概念。 Project Jigsaw(又名 Java Platform Module Sy
我有两个 JPMS 层: 带有 module A 的引导层由 ClassLoaders$AppClassLoader@4fca772d 加载 带有 module B 的子层提供 cervices 并由
我有一个 JPMS 框架,可以动态创建 JPMS 层并向其中添加模块。经过一些测试,在我看来,--add-opens JVM 参数仅适用于引导层,我的意思是应用程序启动时创建的层。 那么,问题是 -
我试图在我的 UML 类图上显示两个 JPMS 模块以及它们内部的包和类。问题是我无法理解使用什么元素来显示模块。请帮忙。 最佳答案 在 UML 中: 有包和组件。 包:见reference 1 Pa
我有一个包含包 com.temp 的模块,它具有服务的接口(interface)和实现 - ServiceInterface 和 ServiceImpl。我的模块信息中有: module temp {
我了解 Java 平台模块系统 (JPMS) 对大型应用程序的好处,但是否有任何理由将小型库或应用程序制作成(单个)模块?如果是这样,是Modular Jar Files实现此目的的最佳方法,还是首选
所以,6.4(终于)出来了,并且有 JPMS support 迫不及待地想试一试,我开始修改我们的一个项目以便使用它。 jjohannes 在他的 repo 之一上有一个 (kotlin) 示例 我试
在使用 Java 9 平台模块系统 (JPMS) 时,我找不到包含 javax.jms 包的模块。 Replacements for deprecated JPMS modules with Java
Here您可以找到以下有关自动模块的信息: The module system also scans META-INF/services and makes the automatic module
我正在使用带有 moduleplugin 的 Gradle (6.0.1)使用 JPMS modules 构建应用程序使用 JDK 13。 但是,即使使用 the application plugin
给定一个在 Eclipse 中从原型(prototype) maven-archetype-quickstart 创建的 Maven 项目(junit 升级到 5.5.2,支持 JPMS),如何将其模
Java 9 deprecated six modules that contain Java EE APIs他们是going to be removed很快: java.activation 与 j
我将 Java 14 与 Jetty 9.4 和 Weld-servlet-shaded-3.1 一起使用,但出现此异常: Caused by: java.lang.reflect.Inaccessi
我是一名优秀的程序员,十分优秀!