Java IntelliJ IDEA created.jar中的Manifest.mf错误

Java IntelliJ IDEA created.jar中的Manifest.mf错误,java,intellij-idea,optaplanner,Java,Intellij Idea,Optaplanner,我试图通过IntelliJ IDEA的jar工件将使用OptaPlanner 6.0.1库的项目打包到一个.jar中,而不是包含标准的manifest.mf Manifest-Version: 1.0 Main-Class: a.b.c.app jar使用ecj-3.7.2.jar中提供的一个,它是OptaPlanner的支持库之一: Manifest-Version: 1.0 Build-Jdk: 1.6.0_26 Built-By: ibrandt Created-By: Apache M

我试图通过IntelliJ IDEA的jar工件将使用OptaPlanner 6.0.1库的项目打包到一个.jar中,而不是包含标准的manifest.mf

Manifest-Version: 1.0
Main-Class: a.b.c.app
jar使用ecj-3.7.2.jar中提供的一个,它是OptaPlanner的支持库之一:

Manifest-Version: 1.0
Build-Jdk: 1.6.0_26
Built-By: ibrandt
Created-By: Apache Maven
Archiver-Version: Plexus Archiver
因此,在尝试运行应用程序时,appname.jar中出现了一个
“无主清单属性”
错误。如果我手动将.jar文件中的清单替换为我的清单,那么一切都正常工作。我能做些什么来解决这个问题吗

我将这些库保存在单独的/lib目录中,它们作为提取目录添加到jar工件的根目录,IntelliJ IDEA是v13.0.1。

要修复:

  • 文件>项目结构
  • 在左侧的项目设置下,选择“工件”
  • 在中间窗格中找到jar定义并选择
  • 在“Output Layout”选项卡的左窗格中,在列表中找到jar文件并选择它
  • 在底部,单击“使用现有清单”按钮并选择项目源中的清单文件
  • 单击OK并运行构建

  • 有几种方法可以生成可执行JAR。使用IntelliJ的GUI功能是一个好方法。另一种方法是使用构建服务器友好的Maven(或类似地在gradle、buildr等中使用):

    它或多或少可以从optaplanner示例maven构建中复制粘贴:

  • 最终用户jar(optaplanner示例-*.jar)必须是
  • 然后必须相应地运行该jar

  • 我也有同样的问题

    确保您的MANIFEST.MF位于:

    src/main/resources/META_INF/
    
    不是


    我也有类似的问题

    问题出在pom.xml文件中

    <archive>
      <manifestEntries>
        <Dependencies>one.jar,
                      two.rar, 
                      other.jar
        </Dependencies>
      </manifestEntries>
    </archive>
    
    
    1.jar,
    2.rar,
    other.jar
    
    我不知道这段代码在eclipse中工作的原因是什么,但在IntelliJ中不工作

    这是正确的

    <archive>
      <manifestEntries>
        <Dependencies>one.jar, two.rar, other.jar</Dependencies>
      </manifestEntries>
    </archive>
    
    
    一个.jar,两个.rar,另一个.jar
    
    Manifest.mf成功了


    我希望这能有所帮助。

    正如@grudolf在另一个答案中的评论所指出的,一种方法(也是我在导入的Gradle项目中唯一有效的方法)是创建一个空罐子,如下所示:

    • 项目结构->工件->+Jar->空
    • 中心窗格现在有“创建清单”和“使用现有清单”按钮。使用其中一个
    • 如果我将具有自己清单的依赖库提取到输出根目录中,我会遇到困难,因为它们似乎会间歇性地覆盖手动创建的新清单。混乱的操作顺序似乎使它起作用
    更新: 这绝对是一个错误的想法。当存在提取的目录时,工作可靠。本质上,如果找到.idea/JARNAME.xml,请将以下元素添加到jar的
    元素的顶部。新文件副本上方包含清单的任何提取元素都将破坏新清单

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

    如果要指定主类,必须将此插件添加到pom.xml:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>Form</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>
    
    
    org.apache.maven.plugins
    maven jar插件
    2.6
    形式
    
    要像清单一样没有问题,您应该在“src”目录中有一个名为“META-INF”的目录。因此,创建它并在其中放置一个名为“MANIFEST.MF”的文件,其中包含以下内容:

    Manifest-Version: 1.0
    Main-Class: <packageName>.Main
    
    清单版本:1.0
    主类:。主
    

    不要忘记替换上面包含主类的包的名称

    你知道像ant、maven或gradle这样的构建工具吗?我知道,但到目前为止,我只使用了make和.NET对应的工具(NAnt、MSBuild)。如果IntelliJ的构建工具不能解决这个问题,我应该选择哪一个?投票纠正这个问题,没有“使用现有清单”按钮,但是输出布局中的清单文件指向正确的位置(…\src\main\java\META-INF\Manifest.MF)好的,必须删除jar工件并重新创建它,这次是“空”而不是“空”“来自具有依赖项的模块”。获得“创建清单”和“使用现有清单”按钮,指向我的清单和已读库并编译输出。与以前相比有两个不同之处:META\U INF\MANIFEST.INF现在显式包含在输出布局中,jar文件似乎生成正确。:)这并不能解决问题,至少对我来说是这样。jamahn的回答确实有效。来自低代表性用户@ds justice的评论如下-@grudolf上面关于创建一个空罐子的评论是我在与一个导入的Gradle项目斗争了几个小时后唯一有效的事情。这是一个重要的问题,请考虑把你的评论作为一个单独的答案。这是正确的答案。看起来,当项目模板是MavenIn时,因特利希的想法是错位了Meta -IF文件夹。我不得不改变我的项目的布局。我以前有一个带有maven布局的项目,但我取消了maven的支持。我从头开始重新创建了一个项目,现在它工作了。这对我来说不起作用,我不得不将Mainfest文件移动到项目的根目录。maven是否愚蠢到将此文件放在错误的目录中?:^)@Kumait,该问题仍存在于IntelliJ 2017.1.5中。我想知道JetBrain团队是否意识到了这一点。我在八月份从你的帖子中删掉了宗教内容。请注意,这篇文章中有很多内容,答案是我们宁愿他们被忽略掉。不过,非常欢迎您将它们添加到您的个人资料或头像中。我有一个确切的情况,并得出了与您相同的结论:项目之间的换行在Eclipse中有效,但在Intellij IDEA中无效。
    Manifest-Version: 1.0
    Main-Class: <packageName>.Main