【问题标题】:Maven won't create runnable jarsMaven 不会创建可运行的 jar
【发布时间】:2017-08-15 04:47:24
【问题描述】:

我的 pom.xml 看起来像这样

...
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <archive>
            <manifest>
              <mainClass>application.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  ...

虽然我指定了主类,但在clean package install maven 上只创建了不可运行的 jar。

我该如何解决这个问题?清单如下所示:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Matthias
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_121

【问题讨论】:

  • 离题:不需要同时调用packageinstall;它们都是构建生命周期的一部分。结果是Maven首先从validate执行到package,然后是validateinstall。我建议:只运行mvn verify 代替(避免install,但这是一个不同的主题),你的构建速度几乎是两倍。

标签: java maven jsoup manifest main


【解决方案1】:

您应该配置 maven jar 插件来创建可执行 jar,而不是 maven 编译器插件:

<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>              
      <archive>
        <manifest>          
            <mainClass>application.Main</mainClass>
        </manifest>
      </archive>
    </configuration>
</plugin>

要声明可以使用的源/目标 java 版本:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

而不是声明编译器插件。
这不那么冗长,并且产生完全相同的结果。

此外,如果您想在可执行 jar 中包含应用程序的依赖 jar,您应该优先使用 maven 程序集插件而不是 maven jar 插件:

<plugins>
  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <mainClass>application.Main</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
    <executions>
      <execution>
        <id>make-assembly</id> <!-- this is used for inheritance merges -->
        <phase>package</phase> <!-- bind to the packaging phase -->
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

【讨论】:

  • 我复制了代码,用 jar 插件替换了编译器插件,并添加了两个属性行。它构建了,但“Main-Class:application.Main”仍然不存在。无论如何感谢组装插件!
  • 不客气 :) 你有没有运行mvn clean package 命令,你能检查plugins 标签是 pom.xml 中build 标签的直接子代吗?
  • 好吧,我正在使用这个 pom:pastebin.com/PEYMjT4R 我执行 clean package install
  • mvn clean package install 没有意义,因为install 是位于package 之后的阶段,默认情况下,生命周期的所有先前任务都在请求的阶段之前执行。所以mvn clean install 就足够了。在您的 pom.xml 中,您混合了两种方式。要么使用 maven-jar-plugin 要么使用 maven-assembly-plugin,而不是两者。此外,在 maven-assembly-plugin 中,您不会像我在回答中显示的那样引用 mainClass。有了这些改变,应该没问题:)
  • 非常感谢您的帮助,现在可以完美运行了。
猜你喜欢
  • 2014-04-01
  • 1970-01-01
  • 2020-12-02
  • 2012-03-06
  • 1970-01-01
  • 2019-10-16
  • 2016-07-09
  • 2018-09-10
  • 2011-01-02
相关资源
最近更新 更多