5

几天来,我一直在尝试为我的 muli-module maven 项目创建一个可执行的 jar 文件。但是,当我尝试运行此 jar 文件时,我得到“无法找到或加载主类 src.main.java.com.domain.Mainclass”(为了我公司的隐私,我更改了名称域和 MainClass)

我已经搜索了几天,但似乎没有一个明显的提示有效。

我的项目有一个主 maven 项目,它下载所有依赖项(打包:POM)和几个模块项目(打包:Jar)。

一切似乎都工作正常,所有文件都编译成类文件,但不知何故主类没有被添加到 pom.xml 中。

我的 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,然后我 cd 进入目标文件夹并执行:java -jar jarfilename.jar

任何提示或帮助都将受到欢迎!

编辑:

我当前的配置为每个模块创建了 2 个 jar 文件:

  • 项目名称-jar-with-dependencies.jar
  • 项目名.jar

当我使用主类导航到模块的目标文件夹时,我可以成功运行 jar 文件。但是,当我尝试运行我的父 maven 项目(带有 packageing:pom 的项目)的 jar 文件时,我仍然遇到同样的错误。有谁知道为什么主jar文件找不到主类?

谢谢!

4

4 回答 4

11

您不应该将其src.main.java作为主类的包名称的一部分。它只是默认 maven 项目文件夹结构约定的一部分。您的配置可能应该是:

<archive>
    <manifest>
      <mainClass>com.domain.project.MainClass</mainClass>
    </manifest>
  </archive>
于 2013-04-01T20:57:31.107 回答
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 assemble: no main manifest attribute

参考:https ://michaelrice.com/2016/08/hello-world-with-kotlin-and-maven/

于 2018-03-14T22:35:29.803 回答
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 文件。

于 2019-06-19T20:22:47.097 回答
0

我有一些不同但相似的场景,所以我想我会分享。我通过构建(pom.xml 打包配置)将一个主要的 maven 应用程序打包到一个战争中。我想添加一个 jar 文件,它是从我们的源代码中的一个包创建的,并与 webapp 战争一起添加到组装输出中。这使我们可以单独交付 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>

我很确定你可以改变你想要完成的阶段,我之前在 compile made 中计算过,以确保它稍后可用于打包。不过,我对 Maven 不是很有经验,所以请注意,这可能在语义上不符合 Maven 约定。

它奏效了!不知道为什么这需要我几个小时才能解决,尽管它确实如此。我刚刚更新了 bin.xml 以将 jar 文件包含在我组装的可交付成果中,瞧!我有一个独立于我的 web 应用程序的 jar 可执行文件,我可以将其用作命令行界面工具。

于 2020-10-23T17:05:55.217 回答