3

有时,我的 Talend Open Studio 组件有资源但没有 Java 源(它们是纯粹的元数据组件)。在这种情况下,我需要禁用 JAR 文件的生成。

我以这种方式配置了 maven-jar-plugin:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <forceCreation>false</forceCreation>
            <skipIfEmpty>true</skipIfEmpty>
            <useDefaultManifestFile>false</useDefaultManifestFile>
        </configuration>
      </plugin>

但我仍然得到 ${project.name}.jar 文件,其中包含 pom.properties、pom.cml、清单和一个仅包含“class {}”的空文件 App.class

虽然我可以使用以下方法禁用所有 Maven 内容的包含:

<archive>
<addMavenDescriptor>false</addMavenDescriptor>
</archive>

我仍然得到一个包含清单文件的 JAR

是否有一些配置参数我配置错误?

4

3 回答 3

9

禁用创建 jars 的最有效方法是配置maven-jar-plugin如下:

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.1</version>
        <executions>
            <execution>
                <id>default-jar</id>
                <phase>none</phase>
            </execution>
        </executions>
    </plugin>
</plugins>

它会将默认的 jar 创建放在none阶段中,它永远不会运行。

于 2012-11-06T22:06:40.903 回答
1

我自己找到了解决方案,即使它只是一种解决方法。如果 /src/main/java 目录不存在,我使用 delete antrun 任务删除 JAR:

<!-- remove the empty JAR if not needed -->
<if>
    <not><available file="${basedir}/src/main/java" type="dir" /></not>
    <then>
    <delete file="${project.build.directory}/${project.name}-${project.version}.jar"/>
    </then>
</if>

此任务需要 antcontrib 才能正常工作,并且,如果您打算使用 maven 进行发布,它就不起作用(但它可以用于仅元数据的组件,例如 Talend Open Studio 插件)

于 2012-11-04T14:33:59.207 回答
1

您可以指示 maven-jar-plugin 不生成 META-INF/maven/* /pom。文件,如Maven Archiver Reference中所述。

此外,您可以使用它的skipIfEmpty选项。

以下代码结合了这两者(只是为了让它们准备好复制粘贴)

...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <skipIfEmpty>true</skipIfEmpty>
                <archive>
                    <addMavenDescriptor>false</addMavenDescriptor>
                </archive>
...

这工作正常,但是当你这样做时mvn install,由于缺少项目工件而失败。类似的问题可能mvn deploy与发布有关,但我没有检查这些。

但是,如果您可以接受 antrun 的删除,那么该属性skipIfEmpty可能会很适合您,并且会更优雅一些。至少它不会引入新的执行及其依赖项等。

于 2012-11-06T23:19:07.953 回答