避免 maven-jar 的最佳方法是啥?

Posted

技术标签:

【中文标题】避免 maven-jar 的最佳方法是啥?【英文标题】:What is the best way to avoid maven-jar?避免 maven-jar 的最佳方法是什么? 【发布时间】:2011-01-12 10:10:12 【问题描述】:

我正在使用不同的插件 (ant4eclipse) 来压缩我的文件。避免执行 maven-jar 插件的最佳方法是什么?

我试图删除<plugin>maven-jar-plugin</plugin> 我试过<exclude> ** / * < / exclude> 我试过<skip>true</skip>

没有成功

【问题讨论】:

***.com/questions/12809559/… 【参考方案1】:

在 Maven 3.0.x(我试过 3.0.2)中,您可以通过将 default-jar 执行绑定到不存在的阶段来禁用 maven-jar-plugin,如 @bmargulies suggested。不幸的是,这在 2.2.1 中不起作用,但您可以通过为 default-jar 执行设置替代 <finalName><classifier> 来防止它干扰您自己的 jar;它仍然会创建一个 jar,但它将被设置为项目的辅助工件,并且不会覆盖您创建的那个。下面是一个适用于 Maven 2 和 Maven 3 的示例:

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>test</groupId>
  <artifactId>test</artifactId>
  <version>0.1-SNAPSHOT</version>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
          <execution>
            <id>default-jar</id>
            <phase>none</phase>
            <configuration>
              <finalName>unwanted</finalName>
              <classifier>unwanted</classifier>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

一旦您禁用了maven-jar-pluginmaven-install-plugin 也可能会给您带来麻烦。在 Maven 3 中,它可以像 maven-jar-plugin 一样被禁用:将 default-install 绑定到不存在的阶段。但是,在 Maven 2 中,maven-install-plugin 要求存在 target/classes 目录,并且它会在不存在主要工件时安装虚拟 jar。

【讨论】:

谢谢,太好了。我对 maven-war-plugin 做了同样的 never 并且能够关闭那个坏男孩。 :-) 我很困惑你从哪里得到 default-jar 执行 ID。我花了一些时间才注意到 Maven 在每次执行期间都会打印该 ID:[INFO] --- maven-install-plugin:2.3.1:install (default-install) @ myproj --- 在本例中为default-install,但对于其他所有插件来说都是相似的。不过感谢您的示例。 更明确地说,可以通过以下方式避免 maven-install-plugin 问题:&lt;plugin&gt; &lt;artifactId&gt;maven-install-plugin&lt;/artifactId&gt; &lt;executions&gt; &lt;execution&gt; &lt;id&gt;default-install&lt;/id&gt; &lt;phase&gt;never&lt;/phase&gt; &lt;/execution&gt; &lt;/executions&gt; &lt;/plugin&gt; 上述方法产生 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-install) on project **** :包装对于这个项目没有为构建工件分配文件-> [帮助 1] [ 真的不能用命令行开关禁用吗?【参考方案2】:

这应该可以解决问题 - 请注意 &lt;id&gt;default-jar&lt;/id&gt;&lt;phase/&gt; 的使用。

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <executions>
          <execution>
            <id>default-jar</id>
            <phase/>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

【讨论】:

对于 maven-install-plugin 也是如此,以防止 it 抱怨没有生成工件。 这会产生无效的 xml。我的 Intelij 抱怨 xml 有效性 使用阶段none来避免XML验证错误。 这行得通,看起来这个插件默认被 mvn 包使用,即使它没有明确地在 pom.xml 文件中......我假设如果你将它包含在 pom.xml 中它会覆盖默认? 我用&lt;phase&gt;none&lt;/phase&gt;代替了&lt;phase&gt;none&lt;/phase&gt;,看起来更干净一些。【参考方案3】:

就我而言,我只想禁用 jar 插件,因为 jar 是空的。您可以在插件配置中使用skipIfEmpty 选项

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <skipIfEmpty>true</skipIfEmpty>
    </configuration>
</plugin>

【讨论】:

仅供参考,此解决方案有效,但不适用于安装阶段。【参考方案4】:

如果你这样声明会发生什么?

<packaging>pom</packaging>

即使它符合您的要求,也要小心。我不确定是否会产生负面影响——例如其他依赖于您的 jar 的 maven 项目无法找到它。

【讨论】:

这需要您重新绑定所有目标,因为它会关闭编译、测试等。【参考方案5】:

使用 maven 3.3.9,以下对我有用:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.1.2</version>
    <executions>
        <execution>
            <id>default-jar</id>
            <phase>none</phase>
            <configuration>
                <finalName>unwanted</finalName>
                <classifier>unwanted</classifier>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>3.0.0-M1</version>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

所以在 maven-jar-plugin 的情况下,我将它绑定到一个不存在的阶段。对于 maven-install-plugin,我使用了“skip”配置参数。关于它的documentation 说:“将此设置为 true 以绕过工件安装。将其用于不需要在本地存储库中安装的工件。”

【讨论】:

【参考方案6】:

将 jar 插件显式绑定到不存在的阶段。

【讨论】:

你确定吗?我刚试过,我仍然看到[INFO] [jar:jar execution: default-jar] 我已经以这种方式让源插件消失了,但我从来没有摆脱过 jar 插件,所以我不确定。【参考方案7】:

正如其他人所说,除了使用 &lt;packaging&gt;pom&lt;/packaging&gt; 之外,无法将其关闭,这会关闭所有内容,并且可能不是您想要的。

即使它会生成两次,一个可行的解决方案是将你的 jar 进程绑定到package 阶段,因为它保证在默认值之后运行。通过覆盖相同的 JAR 文件,您会发现您的 JAR 文件被用于原始文件所在的任何位置。

【讨论】:

【参考方案8】:

我正在使用不同的插件来压缩我的文件。避免执行 maven-jar 插件的最佳方法是什么?

首先,jar:jar 目标是 bound by default 在 package 阶段,用于包装类型为 jar 的项目。其次,没有办法解除绑定到阶段的插件。所以,如果你使用另一个插件(?),要么接受生成 2 个 JAR,要么更改包装(但我认为这不会很好)。

【讨论】:

“无法解除绑定到阶段的插件” - 这不是&lt;phase /&gt; 在上面的答案中所做的吗?【参考方案9】:
       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>        

【讨论】:

不起作用(至少对我来说在 IDE 中使用 Maven 3.0.4 上面提到的配置是错误的 - 我在配置上没有看到任何 选项。但是,有这个选项: true 这将适用于某些用例 - 你有一个没有任何自己的类的模块 - 所以你不想要 jar - 但是您确实希望将包装设置为“jar”(因为当您尝试从该模块启动依赖路径上的代码时,将其设置为 pom 会使 Eclipse 和 Netbeans 混淆)maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html 这是一个错误的答案。跳过开关做一些不同的事情。 Documention 说:“将此设置为 true 以完全绕过单元测试。不推荐使用它,但有时非常方便。”

以上是关于避免 maven-jar 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

避免在 pyspark 代码中使用 collect() 函数的最佳方法是啥?编写优化pyspark代码的最佳方法?

避免错误包含相同文件的最佳方法是啥?

使用 ENSURE 避免代码分析警告的最佳替代方法是啥?

避免传递数据框的最佳方法是啥?

在 java-8 中处理或避免 NPE 的最佳方法是啥?

避免一千个 if 语句的最佳方法是啥?