问题
我有一个module-info.java文件,看起来如下:
module server {
...
// split package issue: lot of java classes within packages with the same name
requires hbase.common;
requires hbase.client;
...
}变通办法1
maven-shader-plugin无法解决问题,因为它不知道groupId,只知道包名。这意味着着色器将从两个包重命名相同的包:hbase.common和hbase.client拆分包问题仍然存在.
变通方法2
我还尝试创建一些shader中间层模块,丢弃不需要的包并解决拆分包问题。但是这个解决方案也不起作用。
shader/模块-info.java:
module shader {
requires hbase.common;
// exports only packages I do need at my code. Shade unneded packages
// IS THERE ANY WAY TO MAKE IT WORK?
// Got: X module reads package org.apache.hadoop.hbase.util from both shader and hbase.common
exports org.apache.hadoop.hbase.util;
} 服务器/模块-info.java
module server {
requires shader;
requires hbase.client;
}PS
有任何Maven插件用于组合拆分包jars吗?
发布于 2018-07-26 10:41:11
重要的是,当同一个包公开来自不同模块的不同类时,此方法不起作用,而且这两个类都是必需的。只有当使用不同的包时,它才能工作,因此您可以从冲突的JAR中过滤出包。
因此,问题是两个依赖项(可能是传递的)具有相同的包名。它与JMPS不兼容,在编译过程中也会发生故障。这个问题的解决方案是手动(使用maven-阴影插件)从依赖项中排除冲突的包。
maven-阴影插件具有每类或每包包含/排除功能。这是文档。
不可行的解决办法(对问题的解释)
问题是,这种方法乍一看不起作用。如果您将插件放在导入两个冲突的JAR的同一个pom.xml上,那么编译将失败,因为"module X reads package org.apache.hadoop.hbase.util from both hbase.client and hbase.common "会失败。JPMS在编译阶段运行(在插件启动的包阶段之前)。下面是一个示例:
server/
|-src/
| |-main/
| |-java/
| |-com.somapackage
| |-module-info.java
| [
| module server {
| requires java.base;
| requires hbase.common; //they have lots of conflicting packages
| requires hbase.client; //they have lots of conflicting packages
| }
| ]
|-pom.xml
[
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
<version>${hbase.common.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.client.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>false</minimizeJar>
<filters>
<filter>
<artifact>org.apache.hbase:hbase-client</artifact>
<excludes>
<exclude>org/apache/hadoop/hbase/util/ **</exclude>
</excludes>
</filter>
<filter>
<artifact>org.apache.hbase:hbase-common</artifact>
<includes>
<include>org/apache/hadoop/hbase/util/ **</include>
</includes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
]工作溶液
为了使JPMS拆分包验证在阴影之后工作,我们必须将冲突的依赖项移动到单独的子模块。此外,我们必须手动解决包冲突(将同一个包从一个依赖项中排除并包含到另一个依赖项中)--这意味着我们必须创建不同的求和:shader1和shader2。以下是代码:
server/
|-src/
| |-main/
| |-java/
| |-com.somapackage
| |-module-info.java
| [
| module server {
| requires java.base;
| requires shader1;
| requires shader2;
| }
| ]
|-pom.xml
[
<dependency>
<groupId>com.organization.proj</groupId>
<artifactId>shader1</artifactId>
<version>${proj.version}</version>
<scope>system</scope>
<systemPath>${project.basedir}/../shader/target/shader1-0.0.1.jar</systemPath>
</dependency>
<dependency>
<groupId>com.organization.proj</groupId>
<artifactId>shader2</artifactId>
<version>${proj.version}</version>
<scope>system</scope>
<systemPath>${project.basedir}/../shader2/target/shader2-0.0.1.jar</systemPath>
</dependency>
]
|
|
shader1
|-src/
| |-main/
| |-java/
| |-com.somapackage
| |-module-info.java
| [
| module shader1 {
| requires java.base;
| requires transitive hbase.client;
| }
| ]
|-pom.xml
[
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.client.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>false</minimizeJar>
<filters>
<filter>
<artifact>org.apache.hbase:hbase-client</artifact>
<excludes>
<exclude>org/apache/hadoop/hbase/util/ **</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
]
|
|
shader2
|-src/
| |-main/
| |-java/
| |-com.somapackage
| |-module-info.java
| [
| module shader2 {
| requires java.base;
| requires transitive hbase.common;
| }
| ]
|-pom.xml
[
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
<version>${hbase.common.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>false</minimizeJar>
<filters>
<filter>
<artifact>org.apache.hbase:hbase-common</artifact>
<includes>
<include>org/apache/hadoop/hbase/util/ **</include>
</includes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
]require transitivehttps://stackoverflow.com/questions/51521625
复制相似问题