首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决Java 9中的拆分包问题

如何解决Java 9中的拆分包问题
EN

Stack Overflow用户
提问于 2018-07-25 14:37:50
回答 1查看 2.6K关注 0票数 3

问题

我有一个module-info.java文件,看起来如下:

代码语言:javascript
复制
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/模块-info.java:

代码语言:javascript
复制
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

代码语言:javascript
复制
module server {
    requires shader;
    requires hbase.client;
}

PS

有任何Maven插件用于组合拆分包jars吗?

EN

回答 1

Stack Overflow用户

发布于 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在编译阶段运行(在插件启动的包阶段之前)。下面是一个示例:

代码语言:javascript
复制
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拆分包验证在阴影之后工作,我们必须将冲突的依赖项移动到单独的子模块。此外,我们必须手动解决包冲突(将同一个包从一个依赖项中排除并包含到另一个依赖项中)--这意味着我们必须创建不同的求和:shader1shader2。以下是代码:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51521625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档