从单个pom.xml定制第二个包装工件,如jar和test-jar?

时间:2014-01-20 01:10:08

标签: java maven m2e

我有一组项目包含(a)生成的bean,以及(b)使用这些bean的代码。我希望每个此类项目都能创建两个不同的工件:包含所有类的常规jar工件,以及仅包含生成类型的自定义beans工件。

我整理了一个快速插件,使用工件附件和" beans"来创建第二个beans工件。分类器,但它在m2e中不能很好地工作。出于这个原因,我认为创建自定义包装类型(例如" test-jar")是正确的事情。

为了完全清楚我想象的是什么,这个pom今天会起作用并创建两种不同的包装类型的工件:

<project>
  <groupId>${groupId}</groupId>
  <artifactId>${artifactId}</artifactId>
  <version>${version}</version>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>test-jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>  
    </plugins>
  </build>
</project>

您可以使用以下任一方法导入:

<dependency>
  <groupId>${groupId}</groupId>
  <artifactId>${artifactId}</artifactId>
  <version>${version}</version>
  <!-- <type>jar</type> -->
</dependency>

<dependency>
  <groupId>${groupId}</groupId>
  <artifactId>${artifactId}</artifactId>
  <version>${version}</version>
  <type>test-jar</type>
</dependency>

我想创建一个插件,让我使用(例如)beans代替test-jar来创建类似的&#34;配对&#34;工件。

我已经在maven源代码中探讨过了,你可以创建自定义类型。然而,&#34; test-jar&#34;好像是&#34;烘烤了&#34;对于maven,我无法判断它是否具有某些特殊功能,我无法使用自己的插件复制此行为。

当然,如果还有另一种方法可以处理这种行为而没有m2e理解的自定义类型 - 例如,但是让m2e理解我的分类器,尽管that seems hard - 我&#39所有的耳朵! :)

如何制作类似的配对包装类型?我已经看过this answer有关如何创建自定义类型的信息,但它似乎只是从具有给定自定义打包类型的pom创建一个工件。

2 个答案:

答案 0 :(得分:2)

好的,想出了如何使用来自同一个POM的其他工件来获取自定义类型。

执行使用附加工件来生成其他工件。对于我的例子,我在我的插件中使用了这个调用(在我完成构建我的JAR文件之后):

@Mojo(name="goal-name", defaultPhase=LifecyclePhase.PACKAGE)
public class MyMojo
    extends AbstractMojo
{
    @Component
    private MavenProject project;

    @Component
    private MavenProjectHelper projectHelper;

    @Component(role=Archiver.class, hint="jar")
    private JarArchiver archiver;


    public void execute() throws MojoExecutionException {
        // Do work...

        // Create JAR file...
        File jarFile=createJarFile(archiver);

        projectHelper.attachArtifact(project, "beans-jar", jarFile);
    }
}

请注意,我指定了自定义类型beans-jar,而没有指定分类器。

接下来,我将一个组件文件放到我的插件src/main/resources/plexus/components.xml

<component-set>
  <components>
    <component>
      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
      <role-hint>beans-jar</role-hint>
<implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
      <configuration>
        <classifier>beans</classifier>
        <extension>jar</extension>
        <type>beans-jar</type>
        <packaging>jar</packaging>
        <language>java</language>
        <addedToClasspath>true</addedToClasspath>
      </configuration>
    </component>
  </components>
</component-set>

在这里,我指定了自定义类型beans-jarclassifier,它似乎用于命名存储库中的新属性。

此文件基于主maven存储库中artifact-handlers.xml项目的maven-core。目前,该文件为located here。 (我通过在maven存储库中的所有.xml文件中查找test-jar来找到此文件。)

要导入该依赖项,请使用:

<dependency>
  <groupId>${groupId}</groupId>
  <artifactId>${artifactId}</artifactId>
  <type>beans-jar</type>
</dependency>

要导入依赖项,您不需要包含自定义插件。

答案 1 :(得分:2)

我建议尝试这样一种更简单的方法:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <executions>
      <execution>
        <id>second-jar</id>
        <goals>
          <goal>jar</goal>
        </goals>
        <configuration>
          <classifier>second</classifier>
          <includes>
            <include>**/service/*</include>
          </includes>
        </configuration>
      </execution>
    </executions>
  </plugin>

通过<include>,您可以定义将哪些类打包到补充jar文件中。