【问题标题】:maven didn't add main-class properlymaven 没有正确添加主类
【发布时间】:2019-09-14 21:52:55
【问题描述】:

我想用 maven 编译我的 Java 项目,但它没有将主类添加到清单文件中。所以我不能在intellij之外运行jar。我已将主类添加到我的 pom.xml 中,但它没有显示在清单文件中。

我在Win10机器和maven3(IntelliJ IDEA 2018.3.1/plugins/maven/lib/maven3)上使用intellij的构建功能。

如果我运行 jar,我会得到错误

$java -jar myJar.jar
kein Hauptmanifestattribut, in myJar.jar

(德语为:没有主清单属性,在 myJar.jar 中,我不知道确切的英文翻译,但这意味着:没有指定主类 )

我尝试了多个 maven 插件(maven-compile、maven-jar、maven-shade)和指定主类的方法,但没有一个将它添加到清单文件中。我让它工作的唯一方法是当我添加行时

Main-Class: Main

手工。

我的 pom 文件(是的,我的主类名为 Main,是的,当我手动添加它时它工作正常)

...

    <groupId>com.myname</groupId>
    <artifactId>myProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

...

清单文件

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: dspicuzz
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_65

如果我手动添加该行,它运行良好

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: dspicuzz
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_65
Main-Class: Main

但我无法让 maven 以这种方式为我生成它。

【问题讨论】:

  • 如何生成 .jar 文件?你使用Build &gt; Build Artifacts 还是Maven &gt; ModuleName &gt; jar &gt; jar:jar?使用第一个我已经遇到了你的问题。
  • 你使用什么 Maven 命令?我建议使用mvn clean package
  • 当你转到 Maven 选项卡 -> your_project -> 生命周期并双击“包”时会发生什么?你看到 BUILD SUCCESS 和你的 jar 文件的位置了吗?
  • 我用Build &gt; ...
  • 我让 intellij 为我做,所以我不能告诉你它使用的 wwitch maven 命令

标签: java maven intellij-idea pom.xml manifest


【解决方案1】:

我在Win10机器和maven3上使用intellij的构建功能 (IntelliJ IDEA 2018.3.1/plugins/maven/lib/maven3)。

IntelliJ 的构建不会重新生成您的 jar 文件。尝试运行包目标以重新创建 jar 文件。

验证您的包名称是否与您的目录结构匹配:com.mytest.Main

如果没有包,它也可以工作,但要确保目录结构也没有包结构。

这将起作用:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myname</groupId>
    <artifactId>runnable</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.myname.Hello</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

</project>

Hello.java

package com.myname;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

运行:

C:\runnable>java -jar target\runnable-1.0-SNAPSHOT.jar
Hello

而且,这是 maven-jar 插件生成的清单文件:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: egallardo
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_181
Main-Class: com.myname.Hello

还要检查您的源目录是否在 intellij 中正确标记(浅蓝色)此图像适用于无包版本。

这些是有关如何使用 IntelliJ 从头开始​​创建项目的分步说明:

  • 创建新项目
  • 选择 Maven
  • 选择您的 SDK(Java 1.8 左右)
  • 不选中“从原型创建”
  • 点击下一步
  • 组 ID:com.myapp
  • 工件 ID:可运行
  • 版本:1.0-SNAPSHOT(默认)
  • 点击下一步
  • 项目名称:可运行(默认)
  • 项目位置:C:\code\java\runnable
  • 点击完成
  • 如果出现提示,请选择“启用自动导入”
  • &lt;build&gt;&lt;properties&gt; 部分复制并粘贴到您的 pom.xml 文件中
  • 扩展runnable -> src -> main -> java
  • 右键点击java文件夹,点击新建->java类
  • 键入 Main 作为新的类名和种类:class(默认)
  • 输入psvm,点击tab生成main方法
  • 添加打印语句:System.out.println("Hello");
  • 使用maven tab双击包
  • jar 文件将在 C:\code\java\runnable\target\runnable-1.0-SNAPSHOT.jar 中创建
  • 尝试运行它:

java -jar C:\code\java\runnable\target\runnable-1.0-SNAPSHOT.jar

检查 jar 文件日期是否与您单击包时的时间匹配。 如果上述方法不起作用,您可能发现了一个错误。尝试不同的 JDK 版本。

【讨论】:

  • 我怀疑这就是答案。我猜这个类是在没有包的情况下定义的。
  • 也可能是包不匹配
  • 但是手动添加类名应该不起作用。
  • @JFMeier 这实际上是添加到清单文件中:&lt;mainClass&gt;com.myname.Hello&lt;/mainClass&gt;,我将添加生成的清单。
  • @JFMeier 我觉得你说得对,手动添加的时候如果运行肯定是没有包名的
猜你喜欢
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 2012-10-28
相关资源
最近更新 更多