【问题标题】:Execute Jar file as standalone application将 Jar 文件作为独立应用程序执行
【发布时间】:2013-08-23 20:07:45
【问题描述】:

我想将 jar 文件作为独立应用程序执行。当我运行以下命令时,我收到此错误消息:

[rcbandit@Laptop target]$ /opt/jdk1.8.0/bin/java -jar DX57DC-1.0.jar
no main manifest attribute, in DX57DC-1.0.jar
[rcbandit@Laptop target]$ 

这是 POM 配置:

<?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.dx57dc</groupId>
    <artifactId>DX57DC</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <name>DX57DC</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mainClass></mainClass>
    </properties>

    <organization>
        <name>Corporation Name</name>
    </organization>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <executions>
                    <execution>
                        <id>unpack-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>unpack-dependencies</goal>
                        </goals>
                        <configuration>
                            <excludeScope>system</excludeScope>
                            <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                            <outputDirectory>${project.build.directory}/classes</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.zenjava</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>2.0</version>
                <configuration>
                    <mainClass>com.dx57dc.main.DX57DC</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

我想我缺少一个 Maven 插件。你能告诉我如何解决这个问题吗?

【问题讨论】:

标签: java maven javafx maven-3


【解决方案1】:

您的 jar 不包含指定可执行 main() 函数的清单,因此 java 不知道要执行/启动哪个类。

使用 maven 时,请查看程序集插件。这使您能够使用正确的 Manifest 创建一个 jar。

或者简单地启动您的程序:java -cp DX57DC-1.0.jar 'your_main_class_here'

问候,

迈克

【讨论】:

    【解决方案2】:

    按如下方式创建您的 jar:

    • 打开命令提示符或终端并找到所有类的存储目录
    • 输入以下命令:

      jar cfev YourJarName.jar EntryClass *

    或者,如果你的类在某个包中,那么,

    • 转到您的包文件夹并运行以下命令:

      jar cfev YourJarName.jar YourPackage.EntryClass YourPackage/*

    这将创建一个 jar 文件。 现在如果双击没有打开jar,那么,

    • 在终端或 Cmd 中找到保存 jar 文件的目录,然后运行以下命令:

      java -jar YourJarName.jar args

    这里的选项是:

        -c  create new archive
        -f  specify archive file name
        -e  specify application entry point for stand-alone application
            bundled into an executable jar file
        -v  generate verbose output on standard output
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      为了使 JAR 文件成为 executable,它需要有一个包含 Main-ClassClass-Path 条目的清单文件:

             <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-jar-plugin</artifactId>
                  <version>2.4</version>
                  <configuration>
                      <archive>
                          <manifest>
                              <addClasspath>true</addClasspath>
                              <classpathPrefix>lib/</classpathPrefix>
                              <mainClass>my.package.App</mainClass>               
                          </manifest>           
                      </archive>
                      <executions>
                          <execution>
                              <id>default-package</id>
                              <phase>package</phase>
                              <goals>
                                  <goal>jar</goal>
                              </goals>
                          </execution>
                      </executions>
                  </configuration>
              </plugin>
      

      这会在 jar 文件的根目录下的 META-INF 目录下生成一个 MANIFEST.MF 文件。仅列出相关条目:

      Class-Path: lib/somejar.jar
      Main-Class: my.package.App
      

      Class-Path 表示在 jar 文件所在的目录中存在一个 lib 文件夹,其中包含文件 somejar.jar

      Main-Class 表明文件App.class 存在于包my.package 中,并且将运行其@987654322@ 方法。

      更新

      如果lib 文件夹不存在,则在加载第一个依赖类时执行将失败。要避开这个你可以pack all the dependencies in your jar with the shade插件:

             <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">
                                      <mainClass>my.package.App</mainClass>
                                  </transformer>
                              </transformers>
                          </configuration>
                      </execution>
                  </executions>
              </plugin>
      

      由于所有依赖项都打包在一起,因此不再需要 Class-Path 条目。

      【讨论】:

        【解决方案4】:

        尝试在插件中添加类似的东西:

            <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.3</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>attached</goal>
                            </goals>
                            <phase>package</phase>
                            <configuration>
                                <descriptorRefs>
                                    <descriptorRef>jar-with-dependencies</descriptorRef>
                                </descriptorRefs>
                                <archive>
                                    <manifest>
                                        <mainClass>com.package.to.my.Main</mainClass>
                                    </manifest>
                                </archive>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
        

        【讨论】:

        • 哪个插件会更合适? maven-assembly-plugin 或 maven-jar-plugin
        • 我们一直在使用汇编插件,我没有尝试过jar插件,但也许这就是要走的路。
        • 使用程序集插件会生成两个 jar 文件。我怎样才能只生成一个?
        • 应该只有一个,你确定你删除了jar插件吗?你用什么命令来构建?
        • 我在开头粘贴了POM文件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-17
        相关资源
        最近更新 更多