【问题标题】:Manifest attribute for java jarjava jar 的清单属性
【发布时间】:2013-06-10 09:36:42
【问题描述】:

在您的帮助下,我能够完成我的第一个 Java 项目。现在我想创建一个 jar 并从 jar 运行应用程序(Java 项目 - 它是一个普通的控制台应用程序,它有另一个项目(控制台应用程序)作为依赖项)。

我用 Eclipse 创建了一个 jar 通过右键单击 - 导出 - 创建了一个 jar。当我尝试从我的 cmd 运行这个 jar 时,我有一个错误(下面是我得到的错误)

no main manifest attribute, in AAA.jar

我在 Google 上搜索了该错误 - 其中大多数是创建 Manifest 文件的原因。我在项目中创建了一个如下所示的清单文件,等于 src 级别

Manifest-Version: 1.0
Main-Class: com.Pacakename.mainclass
Class-Path: log4j-1.2.16.jar db2jcc.jar db2jcc_license_cu.jar

然后 J 尝试再次运行 jar,但这次它说没有 main 方法,而我在类中有一个 main 方法

请有人解释一下创建 Manifest 的明确步骤(如果您向我展示我们拥有 Manifest 文件的位置的文件夹结构,这对我很有帮助)

【问题讨论】:

    标签: java manifest.mf


    【解决方案1】:

    如果您使用的是 eclipse,您可以使用“导出”--> Runnable jar 来实现您的目标。 在这种情况下,您的项目应该有一个有效的运行配置,因为 eclipse 使用这个运行配置作为可运行 jar 的一种蓝图。

    在这种情况下,eclipse 将为您构建清单。

    【讨论】:

    • 我更喜欢使用 Maven pom.xml 来定义我的可执行 .jar 构建,而不是在 Eclipse 中使用“Export --> Runnable jar”。显然,这需要为 Eclipse 安装“M2E”Maven 插件。
    • @djangofan 但是这里的maven方式比较难解释。在我的日常工作中,我还将 maven、ant 或 gradle 与构建系统结合使用来生成 jar。在我看来,生产版本不应该在工作站上构建,而应该在专用的构建系统上构建。
    • @mschenk74 我尝试了与您相同的方式,但是当我尝试运行该 har 时,我仍然收到相同的错误消息没有清单属性
    【解决方案2】:

    如果您使用的是 ma​​ven,我可以建议您使用 shade plugin 来生成可运行的 jar,其中包含所有依赖项(和 ma​​nifest :-))。

    将其包含在您的 pom.xml 中:

    <project>
      ...
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.1</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
                <configuration>
                  <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                      <!-- your main class: -->
                      <mainClass>org.sonatype.haven.HavenCli</mainClass>
                    </transformer>
                  </transformers>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      ...
    </project>
    

    然后执行mvn clean package shade:shade 构建一个jar,你可以使用java -jar jarfilename.jar 从命令行运行它。

    【讨论】:

    • 不,我没有使用它,我的工作场所没有批准 Maven-:(,请告诉我如何在不使用 Maven 的情况下做到这一点
    • 你使用的是普通的eclipse吗?还是 IBM 化版本 (RAD)?
    【解决方案3】:

    假设您具有以下目录结构:

    MyJavaProject
       |-src 
          |- com
              |- example
                   |- Main.java
    

    要在命令行中编译这样的项目,(没有外部依赖)你需要调用命令

    $ cd MyJavaProject
    $ mkdir bin         //to separate *.class file from source files
    $ javac -d bin src\com\example\Main.java
    

    这将在bin 目录中创建Main.class 文件。要将其打包为 *.jar 文件,您可以: 1)用二进制文件创建jar并在cmd中指定Main类 2)创建Manifes并将其嵌入到jar(我将重点关注这个)

    您应该在src 下创建META-INF 目录并在其中创建MANIFEST.mf 文件

    您的清单应如下所示:

    Manifest-Version: 1.0
    Created-By: <Your info>
    Main-Class: com.example.Main
    

    记得在 Manifest 的末尾添加空行!!

    在这种情况下,您指定Manifest-Version 属性、Created-By 属性和要在Main-Class 属性中运行的主类的完全限定名

    要使用此 Manifest 文件和二进制文件创建 Jar,请调用命令

    $ cd bin
    $ jar cfm MyJavaProject.jar ..\src\META-INF\MANIFEST.MF .
    

    这将创建名为 MyJavaProject.jar 的新 jar 并使用您的清单

    如果您的项目依赖于外部类或 jar,请在编译时将它们添加到您的类路径(-cp 选项)并在 Manifest 中添加另一行

    ClassPath: path/to/dependent/jars/jar.jar
    

    重新编译它并创建新的 jar 并享受你的 Java 任务:)

    有关 Manifest 的更多信息,请参阅:docs

    PS:使用 jars,amnifest from cmd line 可能看起来很难看,但它可以教你一些类似于 ava 的概念。如果你想跳过它,请考虑使用Apache MavenApache Ant

    【讨论】:

    • 您对我的解释如此清楚,在阅读您的回复时,我了解的主题很少,我将使用我的 cmd 实现上述内容。
    • 成功了 -:),我可以生成 jar 并运行它,再次感谢
    猜你喜欢
    • 2015-10-01
    • 2018-02-04
    • 2012-08-29
    • 1970-01-01
    • 2013-11-06
    • 2021-05-29
    • 2017-08-18
    • 2019-07-21
    相关资源
    最近更新 更多