带有Maven Shade插件的父子Pom布局

时间:2018-08-28 20:25:18

标签: java maven jar pom.xml maven-shade-plugin

我正在尝试制作一个包含所有项目的胖uber罐。 如果我执行“ mvn软件包”,则会在“ blah”项目标签文件夹下找到一个超级罐子。 (blah项目具有主类。) uber jar包含所有项目(作为文件夹而不是jar),但是当我运行它时,它似乎无法识别Feature1和Feature2项目。

父pom:

<plugins>

  <!-- download source code in Eclipse, best practice -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-eclipse-plugin</artifactId>
    <version>2.10</version>
    <configuration>
      <downloadSources>true</downloadSources>
      <downloadJavadocs>false</downloadJavadocs>
    </configuration>
  </plugin>

  <!-- Set a compiler level -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.1</version>
    <configuration>
      <source>1.8</source>
      <target>1.8</target>
    </configuration>
  </plugin>

  <!-- Maven Shade Plugin -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.1</version>
    <executions>
      <!-- Run shade goal on package phase -->
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <!-- add Main-Class to manifest file -->
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>com.a.blah.main</mainClass>
            </transformer>
          </transformers>
          <filters>
            <filter>
              <artifact>*:*</artifact>
              <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
              </excludes>
            </filter>
          </filters>
        </configuration>
      </execution>
    </executions>
  </plugin>

</plugins>
<modules>
  <module>blahtask</module>
  <module>feature1</module>
  <module>feature2</module>
  <module>blahmessaging</module>
  <module>blah</module>
</modules>

pom等等

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.39</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>com.a.blah</groupId>
  <artifactId>blahtask</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com.a.blah</groupId>
  <artifactId>blahmessaging</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com.a.fs</groupId>
  <artifactId>feature1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com.a.fs</groupId>
  <artifactId>feature2</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>

我在上面的Feature1和Feature2中添加了依赖项,以便它们位于uber jar文件中。这是错的吗? ps。 blahmessaging,feature1和Feature2使用blahtask中的类/函数。

很难找到具有多个项目的maven-shade-plugin示例。很难找到他们的poms文件应该如何以及父子结构如何。

1 个答案:

答案 0 :(得分:0)

原来是服务加载程序问题... 我在Feature1和Feature2项目中手动添加了用于服务加载程序的类名。

如果您正在使用serviceloader,这就是我所做的。

feature1 / src / main / resources / META-INF / services /“某些超类” Feature2 / src / main / resources / META-INF / services /“某些超类”

如果使用文本编辑器打开这两个目录,则对于serviceloader,每个都有一个子类名称。我将它们复制并添加到jar中的“某些超类”文件中。