【问题标题】:How to resolve split package issue in Java 9如何解决 Java 9 中的拆分包问题
【发布时间】:2020-11-01 22:04:54
【问题描述】:

问题

我有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.commonhbase.client 重命名相同的包 - 拆分包问题仍然存在。

解决方法 2

我还尝试创建一些shader 中间层模块,以丢弃不需要的包并解决拆分包问题。但是这个解决方案也行不通。

shader/module-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;
} 

服务器/模块信息.java

module server {
    requires shader;
    requires hbase.client;
}

PS

是否有任何用于组合拆分包 jar 的 Maven 插件?

【问题讨论】:

  • (1) 如果您不介意头痛 --> stackoverflow.com/questions/42358084/… (2) 否则,请删除您的 module-info.java 文件,直到这些依赖项与拼图兼容。
  • 你能补充一下,你用的是什么版本的hbase客户端,普通的还是其他的?
  • @assylias 我不能丢弃 Java9 的模块,因为我需要类似 OSGI 的行为。意味着我在 hadood 和 jetcd 之间存在传递依赖冲突,我希望通过使用模块来解决它们
  • 对你来说可能不是个好消息hbase.apache.org/book.html#java
  • @VolodymyrBakhmatiuk 只是大声思考,一种方法(合并 jars)可能是将它们打包到另一个项目中(maven),然后将该工件用作实际模块化代码的依赖项。 (如前所述,我也没有尝试过。但是如果导出的包是否已排序,您可以figure this out by generating module-info using jdeps。)

标签: java compiler-errors hbase java-9 java-platform-module-system


【解决方案1】:

重要当同一个包从不同的模块公开不同的类并且它们都是必需的时,这种方法不起作用。它仅在使用不同的包时才有效,因此您可以从冲突的 JAR 中过滤掉包。


所以,问题 - 两个具有相同包名的依赖项(可能是可传递的)。它与 JMPS 不兼容,并且在编译期间会出现故障。此问题的解决方案是手动(使用 maven-shade-plugin)从依赖项之一中排除冲突的包。

maven-shade-plugin 具有每个类或每个包的包含/排除功能。这里是documentation

不起作用的解决方案(问题说明)

问题在于,这种方法乍一看是行不通的。如果您将插件放在导入两个冲突 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 拆分包验证在着色后工作,我们必须将冲突的依赖项移动到单独的子模块。此外,我们必须手动解决包冲突(从一个依赖项中排除同一个包并包含到另一个依赖项中)——这意味着我们必须创建不同的 sumbodules:shader1shader2。代码如下:

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 transitive

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2019-07-25
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多