15

我正在使用 IntelliJ IDEA 12.1.3。我有一个模块,我正在尝试按照此处给出的步骤将其转换为 jar 。我构建了 jar 文件并将 jar 文件移动到 D:/. 如果我尝试运行这个 jar,我会收到以下消息:

无法从 jar 加载主类清单属性

如果我使用java -classpath jar com.code.TestCase它运行它,它会完美运行。

为什么会这样?我使用 IntelliJ IDEA 创建了 jar。在那个 jar 中,它包含我添加的所有外部库的所有代码。

在 src 清单文件中:

Manifest-Version: 1.0
Main-Class: com.code.TestCase

但jar的清单文件内容是:

Manifest-Version: 1.0
Build-Jdk: 1.6.0
Built-By: ubuntu
Created-By: Apache Maven
Archiver-Version: Plexus Archiver

Name: org.apache.log4j
Implementation-Vendor: "Apache Software Foundation"
Implementation-Title: log4j
Implementation-Version: 1.2.15

为什么Main-Classjar文件中没有添加MANIFEST.MF,而Main-Class在src中有呢?

4

3 回答 3

54

我遇到了同样的问题,并发现了 Intellij 如何自动填充清单路径的修复和/或错误。

智能用户界面

在创建工件以创建 jar 文件时,IntelliJ 会自动填充当前清单所在的路径。

即在artifact创建页面选择Main-Class后,Intellij会自动添加如下路径\src\java\META-INF\MANIFEST.MF。出于某种原因,构建命令从不使用提到的 MANIFEST.MF 文件。它从头开始创建一个没有主类定义的结果,导致“加载主类失败”

如果使用 IntelliJ UI 创建 jar 工件;通过将其更改为删除自动填充路径/$PROJECT_DIR/src/并单击确定。

默认情况下的示例:

默认的 intellij jar 工件设置

现在这是更改后的样子:

修复了 intellij 工件设置

手动修复以输入正确的 MANIFEST.MF 文件

在 IntelliJ 项目上,打开 .idea\artifacts\_jar.xml

确保它包含

  <element id="directory" name="META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/src/META-INF/MANIFEST.MF" />
  </element>

执行此操作后,您可能需要重新加载 intelliJ,以便它了解对 .xml 文件的更改

对我来说,它发生在存在不同结构的 Maven 项目中(即 src/main/java/..)。

我正在使用带有 IntelliJ 版本 12.1.6 的 OSX 10.9.2

希望有帮助。

于 2014-04-17T20:06:03.593 回答
0

可能这个博客会对你有所帮助。

http://javarevisited.blogspot.in/2013/01/how-to-fix-failed-to-load-main-class-manifest-attribute-jar-java-eclipse.html

于 2013-06-10T13:22:38.983 回答
0

重要规则之一是 Manifest 文件必须以换行符或回车符结尾。如果它不存在,那么现在添加。

于 2013-06-10T13:17:52.073 回答