maven - 如何处理自动模块中的拆分包?

标签 maven maven-compiler-plugin java-9 java-platform-module-system

我目前正在测试将现有应用程序迁移到 Jigsaw 模块。我的一个模块使用 ElasticSearch 及其 Groovy 插件。

  • org.elasticsearch:elasticsearch
  • org.elasticsearch.module:lang-groovy

  • 不幸的是,他们共享一个拆分包,所以mvn install给我:

    x reads package org.elasticsearch.script.groovy from both lang.groovy and elasticsearch



    对描述符中的每个必需模块执行一次,其中 x 是每个模块的名称。

    我假设在 Java 9 最终版本之前,较新的 elasticsearch 版本将消除拆分包,但是通常有一种方法可以处理遗留依赖项中的拆分包吗?

    我希望能够将它们放在类路径而不是模块路径上,但在阅读 this conversation on the mailing list 之后似乎没有办法告诉 Maven 编译器这样做。

    maven 3.3.9 -
    maven-compiler-plugin 3.6.0 -
    jdk9-ea+149 -
    Elasticsearch 2.3.3

    最佳答案

    经过更多测试后,我认为有一些选项可以解决许多(但绝对不是全部)第 3 方拆分包情况。

  • 清理依赖项 - 可能实际上不需要依赖项,或者可以用更新的(或更独特的)JAR
  • 替换依赖项
  • 将您自己的模块重组为两个模块,每个模块都从两个第 3 方模块之一读取包(如果可能/合理)
  • 将第 3 方模块之一(或两者)包装在一个简单模块中,该模块除了显式仅导出您的模块实际需要的包之外什么都不做。

  • 根据具体情况,这些选项之一可能非常适合解决拆分包问题。但是它们都不能处理连贯的代码实际上需要从拆分包的两个部分访问类的情况。

    关于maven - 如何处理自动模块中的拆分包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41385229/

    相关文章:

    引用工作区目录的 maven 变量

    maven - 将 Apache Avro 模式拆分为多个文件,同时在 avro-maven-plugin 中有多个目标

    java - activemq 5.9.0 在 Windows 和 Maven 中失败

    java - 父 pom 中的 maven-compiler-plugin

    java - 使用 Java 9 和 Java 10 从 Eclipse 上的 Tomcat 中删除 java.endorsed.dirs

    maven - 如何在多模块项目中使用 Maven Assembly 插件

    android - Maven编译错误: package R does not exist

    maven - 当 fork 选项用于 maven-compiler-plugin 时没有详细输出

    java - 修补模块引发模块未找到错误

    使用 Java9 运行时的基于 eclipse mars 的应用程序中的 java.lang.NoClassDefFoundError : java. sql.Date