4

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

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-mllib_2.10</artifactId>
    <version>2.2.0</version>
</dependency>

但是,当我运行 jar 工具来确定要在项目的 module-info.java 中使用的自动模块名称时,我收到以下错误:

$ jar --file=spark-mllib_2.10/2.2.0/spark-mllib_2.10-2.2.0.jar --describe-module
Unable to derive module descriptor for: spark-mllib_2.10/2.2.0/spark-mllib_2.10-2.2.0.jar
spark.mllib.2.10: Invalid module name: '2' is not a Java identifier

似乎自动模块算法无法为这个 jar 提供一个有效的 java 名称。如果不添加正确的要求,我会收到 spark mllib 中的软件包丢失的编译错误,例如:

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

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

4

1 回答 1

4

为了获得适当的长期解决方案,Apache Spark 项目必须将模块声明 ( module.info.java) 添加到其 JAR 或Automatic-Module-Name在其 JAR 清单中设置条目。

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

  1. 创建一个manifest.txt包含以下内容的文件:

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

    jar --update --file spark-mllib_2.10.jar --manifest=manifest.txt
    
  3. 确保它有效:

    jar --describe-module --file spark-mllib_2.10.jar
    

如果您打算在实际项目中使用此 JAR,您可以将其提供给您的同事,我会为此创建一个新版本(也许2.10.patched-auto-name?),将其上传到公司的 Nexus,然后编辑 POM 以替换与那个的原始依赖关系。

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

于 2017-10-11T10:02:52.047 回答