我已经尝试了几天为我的muli-module maven项目创建一个可执行jar文件。但是,当我尝试运行这个jar文件时,我得到“无法找到或加载主类src.main.java.com.domain.Mainclass”(为了我公司的隐私,我更改了域名和MainClass)
我已经搜索了几天,似乎没有明显的提示。
我的项目有一个主要的maven项目,可以下载所有依赖项(打包:POM) 和几个模块项目(包装:Jar)。
一切似乎都运行良好,并且所有文件都被编译成类文件,但不知何故主要类没有被添加到pom中。
我的Pom文件插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.domain.project.MainClass</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
我使用的命令:mvn clean package,然后我进入目标文件夹并执行:java -jar jarfilename.jar
任何提示或帮助都会受到欢迎!
编辑:
我当前的配置为每个模块创建了2个jar文件:
当我使用我的主类导航到模块的目标文件夹时,我可以成功运行jar文件。但是,当我尝试运行我的父maven项目的jar文件(带有打包的那个:pom)时,我仍然得到相同的错误。有谁知道为什么主jar文件找不到主类?
谢谢!
答案 0 :(得分:10)
您不应将src.main.java
作为主类包名称的一部分。它只是默认maven项目文件夹结构约定的一部分。您的配置应该是:
<archive>
<manifest>
<mainClass>com.domain.project.MainClass</mainClass>
</manifest>
</archive>
答案 1 :(得分:1)
我要取消这篇文章的内容,因为正确设置3种不同的内容很重要:
Unload <userform object>
必须位于MainClass.java
<project_root>/src/main/java/com/domain/project/
<mainClass>com.domain.project.MainClass</mainClass>
当这三个匹配时,Maven应该打包可执行的JAR文件。
答案 2 :(得分:0)
`<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>
yourclassnameKt
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>`
该插件将添加MANIFEST.mf文件,该文件将告诉Java运行时要执行哪个类。
还有另一个问题有同样的问题 - &gt; Kotlin + Maven assembling: no main manifest attribute
参考:https://michaelrice.com/2016/08/hello-world-with-kotlin-and-maven/
答案 3 :(得分:0)
我有一个不同但相似的情况,所以我想分享一下。我有一个通过构建将主要的Maven应用程序打包到一个大战中(pom.xml打包配置)。我想添加一个jar文件,该文件是从源代码中的一个包创建的,并与webapp war一起添加到组合输出中。这使我们可以单独交付Web应用程序和cli工具。我不想将pom.xml重新配置为多模块,而只是在现有结构中添加一个jar作为单独的可执行文件。我为此撞了一下头。
首先,我最终删除了本地具有maven存储库的整个.m2目录。看来这里对我来说可能是个问题,因为有效的最终代码似乎与最初无效的代码相同。我怀疑这样做的原因是我尝试了不同版本的库并造成了冲突,但是谁知道呢。如果您遇到问题,我的第一个建议是删除.m2文件夹,然后从头开始尝试。
也请参考@Adam Howell的答案,因为这是基础。我创建了一个简化的示例项目来弄清楚为什么什么也没发生,在那儿我意识到我忘了给文件夹结构加上前缀src / main / java ... doh!当然,在我现有的项目中,情况并非如此。
这是我在工作的pom.xml中插入的插件代码:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.myCompany.app.cli.CLITool</mainClass>
</manifest>
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
<finalName>our-cli</finalName>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
我很确定您可以更改要完成此操作的阶段,我早先在进行编译时就考虑到这一点,因为要确保以后可以打包使用。不过,我对Maven并不十分了解,因此请注意,这在语义上可能不符合Maven约定。
它奏效了!不知道为什么这样做花了我几个小时才能解决。我刚刚更新了bin.xml,将jar文件包含在我组装的可交付成果中,还有Voilah!我有一个jar可执行文件与我的Web应用程序分开,可以用作命令行界面工具。