如何使用Maven创建一个超级源jar?

时间:2017-03-08 22:23:28

标签: maven maven-assembly-plugin

是否有一种众所周知的方法来创建一个超级源jar?换句话说,一个项目的所有源代码及其所有依赖项的jar(或至少那些具有-sources.jar的源代码)?

我已经考虑过使用maven-assembly-plugin进行此操作,但使用包含dependencySet(或*.*.*.sources.*)的*.sources并不起作用因为那些实际上不是项目的依赖项,我不想添加所有

2 个答案:

答案 0 :(得分:1)

您可以使用maven-shade-plugin创建超级jar。只需在<build>代码中包含以下内容 -

即可
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
      <execution>
        <id>source-jar</id>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <createSourcesJar>true</createSourcesJar>
          <artifactSet>
            <includes>
              <include>...</include>
            </includes>
          </artifactSet>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

要修改配置,您可以在org.apache.maven.plugins.shade.resource包中使用Resource Transformers

要定义jar的内容,您可以在过滤器中进一步使用includes and excludes

答案 1 :(得分:0)

我在working with sources in the maven-dependency-plugin找到了一些信息。

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-dependency-plugin</artifactId>
     <executions>
       <execution>
        <id>src-dependencies</id>
        <goals>
          <goal>unpack-dependencies</goal>
        </goals>
        <phase>prepare-package</phase>
        <configuration>
          <classifier>sources</classifier>
          <failOnMissingClassifierArtifact>false</failOnMissingClassifierArtifact>
          <outputDirectory>${project.build.directory}/sources</outputDirectory>
          <includeGroupIds>{your group prefix}</includeGroupIds>
          <includes>**/*.java</includes>
          <includeScope>runtime</includeScope>
        </configuration>
      </execution>

因此,如果我这样做,然后运行引用解压缩文件的maven-assembly-plugin,我可以分两步完成。

 <plugin>
     <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
      <execution>
        <id>uber-source</id>
        <goals>
          <goal>single</goal>
        </goals>
        <phase>package</phase>
        <configuration>
          <descriptors>
            <descriptor>ubersource.xml</descriptor>
          </descriptors>
          <outputDirectory>${deploy.internal.directory}</outputDirectory>
          <finalName>${project.artifactId}</finalName>
        </configuration>
      </execution>
    </executions>
  </plugin>

在汇编描述符ubsersource.xml中设置文件:

<fileSet>
  <directory>${project.build.directory}/sources</directory>
  <outputDirectory>.</outputDirectory>
</fileSet>

然后我得到了我的超级源罐......

maven-assembly-plugin和maven-dependency-plugin处理sources的方式可能有一个细微的区别。如果在程序集描述符的sources中引用分类器dependencySet,它会查找pom中实际依赖项的源 - 这不是很有用。但是,在maven-dependency-plugin中,引用sources分类符意味着 依赖项的源。因此,这个解决方案的工作原理。

我还使用mojo-executor将它包装在我自己的插件中以使其单步执行,并在我的pom中单独声明,但这是可选的

这是一个更多的pom代码,但我比maven-shade-plugin更喜欢它,因为它只是我想要的,仅此而已。