允许jar中的两个库使用两个不同版本的依赖java

时间:2016-01-04 19:05:46

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

在我们的java项目中,我们使用的是HBase 1.1.1 java API。该库内部需要使用Guava 15.0(早期版本的HBase,前0.98,使用Guava 18.0)。我们当前的代码库有一个父项目和多个子项目。一些子项目需要仅在Guava 18.0中提供的方法。是否可以在我们的代码库中配置父项目的pom.xml,让HBase使用Guava 15.0,同时让整个剩余的代码库使用Guava 18.0?

我尝试过阴影,如下所示: 父pom(example-parent)

<modules>
    <module>../example-child1</module>
    <module>../example-child2</module>
    .......
</modules>

child pom(example-child1)

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>18.0</version>
</dependency>

<profiles>
<profile>
<id>child1</id>
<build>
<plugins>
    <plugin>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
        <id>make-assembly-shade</id>
        <phase>package</phase>
        <goals>
            <goal>shade</goal>
        </goals>
        <configuration>
            <relocations>
            <relocation>
            <pattern>com.google.guava</pattern>
                <shadedPattern>shaded.com.google.guava</shadedPattern>
            </relocation>
            </relocations>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>
</build>
</profile>
</profiles>

我使用以下方法构建了jar:

mvn clean compile package -Pchild1

但是我仍然在最后一个罐子里只看到一个版本的番石榴。还有其他方法可以做同样的事吗?

1 个答案:

答案 0 :(得分:0)

我强烈建议根据个人资料定义这种'特殊'番石榴依赖性。例如,如果Child1需要Guava 15,则在相关的配置文件中添加具有此特定的依赖项部分。如果您想保持简单,可以将其从父项中删除,然后决定每个配置文件(和模块组)包含哪个版本。