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

时间:2013-04-01 20:54:43

标签: java maven packaging classnotfound

我已经尝试了几天为我的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文件:

  • 的projectname-罐与 - dependencies.jar
  • projectname.jar

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

谢谢!

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:1)

我要取消这篇文章的内容,因为正确设置3种不同的内容很重要:

  1. Unload <userform object>必须位于MainClass.java
  2. Maven程序集插件需要<project_root>/src/main/java/com/domain/project/
  3. 您的包裹应设置为<mainClass>com.domain.project.MainClass</mainClass>

当这三个匹配时,Maven应该打包可执行的JAR文件。

答案 2 :(得分:0)

好像你有一个缺失的插件。将波纹管添加到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运行时要执行哪个类。

还有另一个问题有同样的问题 - &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应用程序分开,可以用作命令行界面工具。