0

我是 javapackager 和 Java 9 的新手,正在研究javapackager参考中的示例,第一个示例如下所示:

示例 1 - 使用 -createjar 命令

javapackager -createjar -appclass package.ClassName
  -srcdir classes -outdir out -outfile outjar -v

Packages the contents of the classes directory to outjar.jar, 
sets the application class to package.ClassName.

我能够制作 jar 文件(tcdmod.jar)而不会出现错误消息。但是当我尝试使用普通命令执行 jar 时出现错误:

java -jar tcdmod.jar

错误:无法找到或加载主类 moduleTCD.com.adonax.tanpura.TCDLaunch 原因:java.lang.NoClassDefFoundError: com/adonax/tanpura/TCDLaunch(错误名称:moduleTCD/com/adonax/tanpura/TCDLaunch)

用于制作 jar 的命令:

javapackager -createjar -appclass moduleTCD/com.adonax.tanpura.TCDLaunch
-srcdir compiled -outdir outex1 -outfile tcdmod -v

编译文件夹:

compiled/moduleTCD/com/adonax/tanpura/ [compiled classes here and below]
compiled/moduleTCD/module-info.class

jar 中的清单显示:

Main-Class: moduleTCD/com.adonax.tanpura.TCDLaunch

到目前为止我为解决这个问题所做的尝试:

  • 我无法从文档中判断我是否正确指定了 -appclass 参数。文档定义 -appclass 如下:“要执行的应用程序类的限定名称。” 但我没有看到任何迹象表明“合格”是什么意思。我尝试了几个看似合理的不同名称。我使用的模块名称的表格是否正确?

  • 我创建了第二个“已编译”目录,在该目录中只是从项目中省略了该模块,并使用我的 -srcdir 重试了该命令。在这种情况下,生成的 jar 文件可以正常工作。

  • 我验证了我可以使用已编译的源代码(来自“已编译”文件夹)从命令行运行程序:

    爪哇-p。-m 模块TCD/com.adonax.tanpura.TCDLaunch

有什么想法吗?为了制作一个独立的 exe 包(主要目标),如果我正确阅读文档,我需要一个基于模块的 jar 文件。

4

1 回答 1

0

通过仔细查看 jar 命令的语法,我终于弄清楚了这一点。(由于 Eclipse IDE 自动处理这件事,我过去从未做过。)

这是我发现并修复的。

1) -appclass参数应该是 main 的包位置,不包括包所在的模块。

因此,我将参数从“moduleTCD/com.adonax.tanpura.TCDLaunch”更改为“com.adonax.tanpura.TCDLaunch”。

2) -srcdir参数应该是模块文件夹(包含 module-info.class)。因此,我将参数从“compiled”更改为“compiled/src/moduleTCD”。

因此,对于我的特殊情况(只有一个模块,没有额外的 jar 或库要链接),以下命令(作为单行)可以正常工作。

javapackager -createjar -appclass com.adonax.tanpura.TCDLaunch -srcdir
compiled/src/moduleTCD -outdir outex1 -outfile tcdmod -v

这是也有效的(单行)jar 命令。

jar -cfe outex1.tcdmod.jar com.adonax.tanpura.TCDLaunch -C 
compiled/src/moduleTCD .
于 2018-05-09T06:00:21.913 回答