Maven Jar Builder:无法找到或加载主类

5
我已经试了几天来创建我多模块maven项目的可执行jar文件。然而,当我尝试运行这个jar文件时,会出现“无法找到或加载主类src.main.java.com.domain.Mainclass”错误(我已经为了公司的隐私而更改了domain和MainClass的名称)。
我搜索了好几天,但任何明显的提示似乎都不起作用。
我的项目有一个主maven项目(packaging:POM),它下载所有依赖项,以及几个模块项目(packaging:Jar)。
一切都运行正常,所有文件都编译成了class文件,但是某种方式主类没有添加到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 jar文件名.jar 如有任何提示或帮助,将不胜感激!
编辑:
我的当前配置会为每个模块创建2个jar文件:
- projectname-jar-with-dependencies.jar - projectname.jar 当我导航到具有我的主类的模块的目标文件夹时,我可以成功运行jar文件。 然而,当我尝试运行父pom Maven项目的jar文件时,仍然出现相同的错误。 有人知道为什么主jar文件找不到主类吗?
谢谢!
4个回答

11

你的主类包名中不应该包含src.main.java。它只是默认的Maven项目文件夹结构约定的一部分。你的配置可能应该是这样的:

<archive>
    <manifest>
      <mainClass>com.domain.project.MainClass</mainClass>
    </manifest>
  </archive>

谢谢@NilsH。我按照您建议的配置进行了更改,但仍然存在同样的问题。我在主POM文件(打包:Pom)中有以下内容。是否有帮助知道我的每个模块和主项目都有一个目标文件夹,在每次构建后都包含2个jar文件?1:projectname-jar-with-dependencies.jar 2:projectname.jar - Jonstewart
我发现我的主类模块目标文件夹中的jar文件可以运行。对于为什么我的主项目jar似乎没有正确的类,有什么想法吗? - Jonstewart
这个工作正常。Maven为每个包构建了一个jar文件,你必须确保使用正确的jar文件。感谢你的所有帮助! - Jonstewart
太好了!很高兴你解决了它 :) - NilsH

1
我将恢复此帖子,因为正确设置以下3个不同的内容非常重要:
  1. MainClass.java 需要在 <project_root>/src/main/java/com/domain/project/ 中。
  2. Maven 组装插件需要 <mainClass>com.domain.project.MainClass</mainClass>
  3. 您的包应该设置为 com.domain.project
当这三个匹配时,Maven 应该打包一个可执行的 JAR 文件。

1
似乎您缺少其中一个插件。请将以下内容添加到pom.xml文件中。
<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运行时应该执行哪个类。
还有一个问题也有相同的问题 -> Kotlin + Maven assembling: no main manifest attribute 参考资料: https://michaelrice.com/2016/08/hello-world-with-kotlin-and-maven/

0

我有一个略微不同但类似的情况,所以我想分享一下。我有一个主要的Maven应用程序通过构建(pom.xml打包配置)打包成war文件。我想添加一个jar文件,该文件是从我们源代码中的一个包创建的,并与Web应用程序war一起添加到组装输出中。这使我们能够将Web应用程序与cli工具分别交付。我不想重新配置pom.xml为多模块,而只是将jar作为现有结构中的单独可执行文件添加进来。我为此苦恼了一段时间。

首先,我最终删除了本地maven存储库中的整个.m2目录。对我来说,似乎存在问题,因为最终有效的代码似乎与最初不起作用的代码相同。我怀疑原因是我尝试了不同版本的库并创建了冲突。如果您遇到问题,我建议您删除.m2文件夹并从头开始尝试。

还要参考@Adam Howell的答案,因为那是基础知识。我创建了一个简化的示例项目来弄清楚为什么没有发生任何事情,在那里我意识到我忘记了将文件夹结构前缀设置为src/main/java...当然,在我的现有项目中,情况并非如此。

这是我在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!我有一个独立于我的Web应用程序的jar可执行文件,可以用作命令行接口工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接