如何解决名称与Java9模块系统不兼容的maven依赖关系?

如何解决名称与Java9模块系统不兼容的maven依赖关系?,java,maven,apache-spark-mllib,java-9,java-module,Java,Maven,Apache Spark Mllib,Java 9,Java Module,我正在尝试用java 9和maven构建一个使用依赖关系的演示项目: <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-mllib_2.10</artifactId> <version>2.2.0</version> </dependency> 自动模块算法似乎无法为这个jar提供一个有效的j

我正在尝试用java 9和maven构建一个使用依赖关系的演示项目:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-mllib_2.10</artifactId>
    <version>2.2.0</version>
</dependency>
自动模块算法似乎无法为这个jar提供一个有效的java名称。如果不添加适当的requires,我会得到spark mllib中缺少的包的编译错误,例如:

package org.apache.spark.mllib.linalg does not exist

在我的项目中添加正式的保留模块名称或它自己的模块信息之前,我是否可以在项目中使用此依赖项?

要获得正确的长期解决方案,Apache Spark项目必须添加模块声明(
module.info.java
)或者在JAR的清单中设置
自动模块名

如果你等不及了,你可以很容易地自己做后者:

  • 创建包含以下内容的文件
    manifest.txt

    Automatic-Module-Name: org.apache.spark.mlib2
    
  • 将该条目附加到JAR的清单中:

    jar --update --file spark-mllib_2.10.jar --manifest=manifest.txt
    
  • 确保它工作正常:

    jar --describe-module --file spark-mllib_2.10.jar
    
  • 如果您计划在实际项目中使用此JAR,您可以将其提供给您的同事,我将为此创建一个新版本(可能是
    2.10.patched auto name
    ?),将其上载到公司的Nexus,然后编辑POM以用该版本替换原始依赖项


    总而言之,这可能不值得付出努力,您可能只想等待。

    从外观上看,这可能也会对您有所帮助。不过,在这一点上,所有者看不到太多进展。模块名可以从大多数JAR文件中派生出来,但也有一些异常值具有奇怪的名称,无法映射到有用的名称。在这种情况下,最好向apachespark项目提交一个bug,让他们选择一个模块名,并使用“automaticmodulename”属性将其添加到JAR文件中。更好的做法是发布显式模块,但它们可能还没有准备好发布。这不应该是
    manifest.mf
    ?不,用于
    manifest
    选项的文件名并不重要。它可以是
    foobar
    ,用于所有
    jar
    cares-它只需将内容从文件中取出并添加到正确的位置。这非常有效。更新文件可以是任何名称,因为您只是将其中的条目附加到jar中现有的MANFEST.MF中。需要注意的一点是,进行更新的文件必须以新行结尾,否则更新会自动失败。我将向本地回购中添加更新的jar,如下所述:
    jar --describe-module --file spark-mllib_2.10.jar