【问题标题】:My java application can be opened with java -p -m command, but not with java -jar or double clicking我的 java 应用程序可以使用 java -p -m 命令打开,但不能使用 java -jar 或双击
【发布时间】:2018-12-18 04:27:33
【问题描述】:

我的项目是 r0d0t 的 InfEncoder 的编辑版本。你可以在 GitHub 上找到它here

我修改的主要是对 Java 10 的支持,即修复损坏的引用和不推荐使用的库。我当前的代码可用here

当我在 NetBeans 中构建项目时,它会显示以下消息:

"要在没有 Ant 的情况下从命令行运行此应用程序,请尝试:

C:\Program Files\Java\jdk-10.0.1/bin/java -p C:\projects\InfEncoder-master\dist\InfEncoder.jar -m InfEncoder"

该命令工作正常并运行代码。但是,我想做的是通过双击或使用 java -jar 命令来运行 .jar 文件,但整个想法是让 r0d0t 的原始项目使用 Java 10 运行。

编辑:由于需要在项目中包含一些已弃用的库,NetBeans 创建了一个模块信息类,其中说明

module InfEncoder {
requires java.activation;
requires java.desktop;
requires java.base;
requires java.logging; }

这可能是命令-p 具有"InfEncoder" 作为值的原因。运行项目时,入口模块需要是在 module-info 中具有引用库的模块。我已经通过在 module-info 类中放置 InfFrame 而不是 InfEncoder 来确认这一点,并且 netbeans 给出的命令会更改入口模块。

【问题讨论】:

  • 很多人我都不愿意访问一个未知的谷歌驱动器。所以我看不到代码。你怎么给你的罐子装瓶?你用maven吗?如果你这样做,你应该看看组装或阴影插件。如果没有,您可能可以使用 IDE 的“导出为可运行 jar”(或类似)例程。
  • 代码现在在 GitHub 上,而不是 google drive。我在没有 Maven 的 Netbeans 中构建我的 jar。我很新,不知道 Netbeans 中的“导出为可运行 jar”选项

标签: java netbeans jar


【解决方案1】:

为了能够使用 java -jar 命令或双击 jar 从 jar 运行 Java 应用程序,jar 的 META-INF/MANIFEST 文件必须包含 Main-Class 属性,例如

Main-Class: com.my.App

如果com.my.App 是包含应用程序主方法的类的完全限定名。

【讨论】:

  • 感谢您的帮助。我的清单如下所示:Manifest-Version: 1.0 Ant-Version: Apache Ant 1.10.1 Created-By: 10.0.1+10 ("Oracle Corporation") Main-Class: infencoder.InfFrame Class-Path: .lib/* 我很肯定 InfFrame 是我的主类(它包含 main 方法)。
  • Class-Path: .lib/* 条目不正确。 Class-Path 不支持通配符,请参阅 (docs.oracle.com/javase/tutorial/deployment/jar/downman.html)。而且,真的有.lib 目录吗?用点作为库目录前缀是一种不寻常的做法。顺便说一句,如果您使用java -jar 命令从命令行运行应用程序,会发生什么
  • 好的,我检查了注释掉不正确的行是否会有所帮助,我得出的结论是,我对清单所做的更改在我构建项目后不适用。当我使用 java -jar 编译它时,它会显示我已包含在 lib 文件夹中的未定义类的错误。但是,使用 java -p -m 命令时不会显示错误。
  • 可能是因为(根据文档)您使用了错误的-p 选项:它的参数应该是目录 的列表。我猜 JVM 是宽松的,忽略了您正在指定文件的事实,并且只使用 C:\projects\InfEncoder-master\dist 作为搜索路径(如果您的 lib 目录是 dist 的子目录,这将解释为什么它可以工作。
  • lib 不是dist 的子目录,我敢肯定。命令本身出现在 NetBeans 编译器中,所以我认为它没有任何错误。 -p 不是指定要加载的模块在哪里-m 的命令吗?我的猜测是它像目录一样读取 .jar 文件并从中加载模块“InfEncoder”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多