无法使用javapackager创建基于模块的jar

时间:2018-05-08 15:16:56

标签: java java-9 java-module javapackager

我是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如下:“要执行的应用程序类的限定名称。”但我没有看到任何“合格”含义的迹象。我试了几个看似合理的名字。具有我使用的模块名称的表单是否正确?

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

  • 我确认我可以使用已编译的源(来自“compiled”文件夹)从命令行运行程序:

    java -p。 -m moduleTCD / com.adonax.tanpura.TCDLaunch

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

1 个答案:

答案 0 :(得分:0)

我最后通过仔细研究jar命令的语法来解决这个问题。 (由于Eclipse IDE自动处理这个问题,我以前从未做过的事情。)

这是我发现和修复的内容。

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

因此,我改变了" moduleTCD / com.adonax.tanpura.TCDLaunch" to" com.adonax.tanpura.TCDLaunch"。

2) -srcdir 参数应该是模块文件夹(包含module-info.class)。因此,我改变了#34;编译" to"编译/ 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 .