Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用maven构建可执行jar?_Java_Eclipse_Maven 2_Build Process_Executable Jar - Fatal编程技术网

Java 用maven构建可执行jar?

Java 用maven构建可执行jar?,java,eclipse,maven-2,build-process,executable-jar,Java,Eclipse,Maven 2,Build Process,Executable Jar,我正在尝试使用maven为一个名为“logmanager”的小型家庭项目生成一个可执行jar,如下所示: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <ma

我正在尝试使用maven为一个名为“logmanager”的小型家庭项目生成一个可执行jar,如下所示:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

我将这里显示的代码片段添加到pom.xml中,并运行mvn assembly:assembly。它在logmanager/target中生成两个jar文件:logmanager-0.1.0.jar和logmanager-0.1.0-jar-with-dependencies.jar。我双击第一个jar时出错:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
双击jar-with-dependencies.jar时出现了一个稍微不同的错误:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar
Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar
我复制并粘贴了路径和类名,并检查了POM中的拼写。我的主类可以通过eclipse启动配置正常启动。有人能帮我弄清楚为什么我的jar文件不能运行吗?还有,为什么一开始就有两个罐子?如果你需要更多信息,请告诉我

以下是完整的
pom.xml
,供参考:


4.0.0
com.gorkwobble
日志管理器
日志管理器
0.1.0
按计划系统地重命名指定的日志文件。旨在帮助管理客户端日志并防止长时间连续的日志文件。
org.apache.maven.plugins
maven jar插件
2.2
org.apache.maven.plugins
maven汇编插件
2.2-β-4
带有依赖项的jar
com.gorkwobble.logmanager.logmanager
包裹
单一的
org.apache.maven.plugins
maven编译器插件
1.6
1.6
公地郎
公地郎
2.4
开放交响乐团
石英
1.6.3
公地收藏
公地收藏
3.1
公用记录
公用记录
1.1
javax.transaction
jta
1.1
运行时
junit插件
junit插件
1.4
测试
朱尼特
朱尼特
4.1

事实上,我认为你提到的答案是错误的(更新-20101106:有人修复了它,这个答案指的是),这至少部分解释了为什么你会遇到麻烦


它在logmanager/target中生成两个jar文件:logmanager-0.1.0.jar和logmanager-0.1.0-jar-with-dependencies.jar

第一个是由
JAR:JAR
package
阶段生成的logmanager模块的JAR(因为模块具有
JAR
类型的打包)。第二个是由
assembly:assembly
生成的程序集,它应该包含来自当前模块及其依赖项的类(如果您将描述符
jar与依赖项一起使用)

我双击第一个jar时出错:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
如果您应用了作为引用发布的链接的建议配置,那么您将jar插件配置为生成一个可执行工件,如下所示:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
同样,如果按照建议配置了汇编插件,则会出现如下情况:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
当然,用您想要执行的类替换
org.sample.App
。还有一点好处,我将
assembly:single
绑定到
package
阶段,这样您就不必再运行
assembly:assembly
。只需运行
mvn install
,程序集将在标准构建期间生成

因此,请使用上面给出的配置更新pom.xml,然后运行
mvn clean install
。然后,将cd放入
目标
目录,然后重试:

java -jar logmanager-0.1.0-jar-with-dependencies.jar
如果您遇到错误,请用它更新您的问题,并发布
META-INF/MANIFEST.MF
文件的内容以及
pom.xml
的相关部分(插件配置部分)。另外,请张贴以下结果:

java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager
演示它在命令行上工作良好(不管eclipse说什么)

编辑:对于Java6,您需要配置maven编译器插件。将此添加到pom.xml中:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>

org.apache.maven.plugins
maven编译器插件
1.6
1.6

如果您不想在包上执行组装目标,可以使用下一个命令:

mvn package assembly:single
这里package是关键字。

Pascal Thivent的答案也帮了我的忙。 但是如果您在
元素中管理插件,则必须在插件管理之外再次定义程序集,否则如果您运行
mvn install
,则依赖项不会打包在jar中

<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>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <build>
        <pluginManagement>
            <plugins>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>main.App</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

            </plugins>

        </pluginManagement>

        <plugins> <!-- did NOT work without this  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
            </plugin>
        </plugins>

    </build>


    <dependencies>
       <!--  dependencies commented out to shorten example -->
    </dependencies>

</project>

4.0.0
1.0.0-SNAPSHOT
罐子
org.apache.maven.plugins
maven编译器插件
3.1
1.6
1.6
org.apache.maven.plugins
maven汇编插件
2.4
main.App
带有依赖项的jar
组装
包裹
单一的