如何解决名称不符合 java 9 模块系统的 Maven 依赖项?

And*_*itt 5 java maven java-9 apache-spark-mllib java-module

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

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-mllib_2.10</artifactId>
    <version>2.2.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但是,当我运行 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
Run Code Online (Sandbox Code Playgroud)

看来自动模块算法无法为该 jar 提供有效的 java 名称。如果没有添加正确的需求,我会收到 Spark mllib 中缺少软件包的编译错误,例如:

package org.apache.spark.mllib.linalg does not exist
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*lai 6

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

如果您等不及,您可以自己轻松完成后者:

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

     Automatic-Module-Name: org.apache.spark.mlib2
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将该条目附加到 JAR 的清单中:

     jar --update --file spark-mllib_2.10.jar --manifest=manifest.txt
    
    Run Code Online (Sandbox Code Playgroud)
  3. 确保它有效:

     jar --describe-module --file spark-mllib_2.10.jar
    
    Run Code Online (Sandbox Code Playgroud)

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

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

来自评论

需要注意的一件事是,您进行更新的文件必须以新行结尾,否则更新将自动失败。

  • 不,用于“manifest”选项的文件名并不重要。它可以是所有“jar”关心的“foobar” - 它只是将内容从文件中提取出来并将其添加到正确的位置。 (4认同)
  • 这非常有效。更新文件可以是任何名称,因为您只是将其中的条目附加到 jar 中现有的 MANFEST.MF 中。需要注意的一件事是,您进行更新的文件必须以新行结尾,否则更新将自动失败。我将把更新后的 jar 添加到本地存储库,如下所述:/sf/ask/156083021/ (4认同)

归档时间:

查看次数:

1238 次

最近记录:

3 年,4 月 前