草庐IT

无法解析 Java 9 自动模块依赖项/找不到模块

coder 2024-03-29 原文

我正在尝试将一些遗留应用程序迁移到新的 Java 9 模块系统,以加强其封装。

我从外到内开始,假设外围的类具有最少的外部依赖性。

如您所料,我已经声明了一个非常开放的模块:

module com.example.user {   
    exports com.example.user;
}

这会立即破坏整个项目(在所有类中),突然间,外部依赖项的每个导入都不再解析(导致超过 1k Java 问题):

The import com.otherexample cannot be resolved

The import org.springframework cannot be resolved

etc.

同一项目中的本地包 com.example.price 仍然有效 - java.util 等也是如此。

所有外部依赖项都是(曾经)使用 Maven 管理的。在(Eclipse 项目)构建路径中,我仍然可以将它们视为“类路径”依赖项 - 但只有“模块路径”中的 JRE 系统库。

这两个概念可以共存吗?目前看来,通过在项目的任何地方使用单个 module-info.java,所有类路径依赖项都停止工作了吗?

我确实读过关于使用 automatic modules 的内容,这似乎意味着您可以通过将旧版/非模块化 jar 包含在您的模块路径中来使用它们,然后通过它们的文件名引用它们。他们使用示例:

module com.foo.myapp {
  requires guava;  // guava not yet modularised, so use the filename
}

我找不到太多其他信息,但这似乎符合 Eclipse 在自动生成 module-info.java 时使用的约定,例如:

spring-core-4.3.8.RELEASE.jar

变成:

requires spring.core;

但是,这仍然会导致 Eclipse 报告 Java 错误:

spring.core cannot be resolved to a module

Maven 报告:

[ERROR] module-info.java:[39,16] error: module not found: spring.core

...并且项目中具有外部依赖性的每个类仍然损坏。

最佳答案

感谢Robert Scholte指出更新的 maven-compiler-plugin 3.7.0(我一直在使用 3.6.1),这确实清理了编译目标命令行输出(具有 Java 9 特性),以帮助我找到问题。这缩小了每个 requires 报告的错误,给我的错误是:

[WARNING] ********************************************************************************************************************
[WARNING] * Required filename-based automodules detected. Please don't publish this project to a public artifact repository! *
[WARNING] ********************************************************************************************************************
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 56 source files to ./target/classes
~~~ snip ~~~
[ERROR] module-info.java error: module not found: foo.bar

匹配 eclipse :

foo.bar cannot be resolved to a module

只有六个自动模块/库 (jar) 出现错误,而不是全部 (24) 个。太好了。

在我的 POM 中,我将源目录的输出拆分到它们自己的输出目录 (target/classes)。但是,由于 module-info.java 引用了该文件夹中的代码(类)未使用/引用的依赖项(例如 requires spring.core;) - 它无法解决它们。

为什么?基本 Maven 依赖管理 - 我将这些库限定在默认目标之外(以匹配输出目录拆分)。

一个相当基本的结果 - 但我想我不会是唯一遇到这种情况的人,因为 Java 开始侵占依赖管理的某些方面,这些方面与 Maven 的传统使用重叠。

关于无法解析 Java 9 自动模块依赖项/找不到模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46939741/

有关无法解析 Java 9 自动模块依赖项/找不到模块的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  4. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  5. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  8. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  9. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  10. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

随机推荐