问题标签 [module-info]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 针对旧版 JDK 的 JPMS/Jigsaw 兼容 Java 库
我试图弄清楚如何使用 Maven 构建与 JDK 7 和 8 兼容的库 jar 文件,但包含一个module-info.java
明确声明其公共 API 的文件。
问题:我需要为旧的目标版本进行编译,但旧的 JDK 显然不知道新的 JPMS 功能。
在Robert Scholte 的这次演讲中,似乎最好的方法是仅使用 JDK9 编译模块信息文件。但是我如何将它包含到 .jar 中呢?
任何最小的例子pom.xml
都会有很大的帮助!:-)
编辑:要清楚一点:我没有收到任何编译器错误。我只是在询问为 JDK 9 用户使用 JPMS 的基本概念,但要让我的库向后兼容 JDK 7 和 8。
java - 使用 java 9 时执行 maven-compiler-plugin:3.6.1:testCompile 失败
我知道有很多类似错误的问题。在此之前我会很感激,因为重复考虑到它只发生在 Java 9 上。
我确实安装了 java 9
为了简化示例,如果我下载一个非常简单的示例https://examples.javacodegeeks.com/core-java/java-9-httpclient-example/并尝试/
mvn 干净安装包 -e
pom.xml
我有点困惑可能导致此问题的原因。最重要的是,我面临另一个挑战,这让第一次尝试使用 Java 9 的人更加困难:我的 Eclipse 没有正确接受 Java 9。我尝试在我刚刚下载的 Eclipse Oxygen 中安装 Java 9 Support它,但我得到“在http://download.eclipse.org/eclipse/updates/none找不到存储库”。而且我不能让这个 mvn 插件将 Java 版本更新到 9(它曾经在 Java < 1.8 时正常工作:
这就是我试图从命令行编译 straich 的原因。
我读到 Java 9 带来了模块化的新概念,这将帮助我们更好地组织包,但如果这能促使我解决我的问题,我会非常有限。当有人看到“无法解析模块信息”时,这可能是一些明显的解决方案,但我无法想象有什么有用的尝试。
我的直接问题是我可以检查什么以便编译。关于使 Eclipse Oxygen 当前版本与 Java 9 兼容的另一个技巧也将受到重视。
- 已编辑
不到 24 小时前为 Windows 下载的 Eclipse 版本:
面向 Web 开发人员的 Eclipse Java EE IDE。
版本:Oxygen.2 版本 (4.7.2) 内部版本号:20171218-0600
- 第二次编辑
在我从 1.9 更改为 9 之后,红色错误图标消失了,我现在有了 Java 9。不过,现在我收到了这个错误:
这对我来说没有意义,因为:
- 第三次修改
java - JPMS 是否支持模块版本?
我认为 JPMS 不支持模块版本。但是,当我这样做时,java --list-modules
我有以下输出:
所以,我无法理解这@9
是什么。是这个版本还是什么?如果 JPMS 支持模块版本,我可以在模块 A 的 module-info 中设置模块 A 需要特定版本的模块 B 吗?
java - ServiceLoader::load 与命名模块的未命名模块交互
我有一个这样的项目:
的实现UnnamedStart.java
是:
请注意,main是未命名的模块。
api/src/module-info.java
是:
并且impl/src/module-info.java
是:
更新 1.1 - 下面更新的代码见评论,添加requires
更新 1.2 - 下面的代码已更新,在创建问题时provides A with B
更改为provides B with A
错误,原本没问题
当我在中运行我的代码时,UnnamedStart.java
我最终没有在services
.
我还尝试在以下位置创建一个静态方法com.foo.api.ApiInterface
:
并添加,但它给出了相同的结果(什么都没有)api/src/module-info.java
。uses com.foo.api.ApiInterface;
我使它工作的唯一方法是将main从未命名模块迁移到命名模块。
1.当未命名模块尝试与命名模块交互时, java 9是如何工作的?
2.是否有可能让它工作并保持主要的未命名模块?
更新 1.3 -添加了相关项目
java - 列出应用程序启动期间解析的模块
如何在应用程序启动时了解已解析的模块列表,从而确定从根模块可以访问哪些服务提供者。
java - 无法使用 Maven 编译简单的 Java 10 / Java 11 项目
我有一个简单的 Maven 项目:
pom.xml:
当我通过 构建项目时mvn -X install -DskipTests=true
,它失败了:
有没有办法来解决这个问题?
java - 带有模块逻辑的 java 运行时错误:java.lang.NoClassDefFoundError: javax/xml/ws/Service
因为我迁移到 jdk9 我在运行时收到以下错误:
我没有收到编译错误,但只有运行时错误。模块信息如下:
并且 pom.xml 包含以下依赖项:
即使我尝试了不同的配置,最终的结果仍然是这个烦人的错误!有人知道这里发生了什么吗?
gradle - 使用 gradle 合并 jar 以进行拆分包
我创建了一个 Web 应用程序。我正在使用 Gradle。我是 Gradle 的新手,我正在尝试将我的一个项目迁移到 Java 9 模块系统。我将所有 jar 移动到模块路径而不是类路径。这是我的 build.gradle 的片段
现在,如果我执行 gradle build
or buildDependents
ortestClasses
任务,那么我会收到以下错误
那么为什么我得到模块未找到异常jUnit
,log4j.api
和org.apache.logging.log4j.web
。我检查了模块路径并且罐子在那里。
其次,我阅读了有关拆分包的信息。我的问题是,我从错误中知道这两个罐子是java.sql and javax.transaction.api
并且jaxb.runtime and jaxb.core
与其他罐子相似。
我可以制作一个 Gradle 任务,将这两个 jar 合并为一个,并在模块路径中包含那个 jar,以便可以删除这些错误?还是有另一种方法来解决此类错误?
是否可以将一些 jar 移动到模块路径并将一些 jar 移动到类路径?以及如何找到要移动模块路径的 jar 以及要移动类路径的 jar?
谢谢
java - 为什么需要传递仅限于直接需要包含它的模块的模块?
假设有一个模块x
可以导出一些东西。然后是模块a
:
然后有 100 个模块b
需要a
:
然后有100个模块c
需要各自b
的s
假设c1
...c100
不需要了解来自a
. 这些仅由b1
...b100
内部使用,因此不需要传递。
b1
然而,由...导出的 APIb100
使用由 . 导出的包中的类x
。
模块c1
...c100
看不到那些。试图编译它们,结果是
为什么requires transitive
仅限于直接需要包含它的模块的模块?module-info
如果不编辑 100 个文件,如何解决上述问题?
更新:至少有 3 种方法可以“解决”这个问题:
- 添加
requires transitive a
到b1
...b100
- 添加
requires transitive x
到b1
...b100
- 添加
requires x
到c1
...c100
虽然在这种特殊情况下所有都可以工作,但尚不清楚应该使用哪一个以及它们各自的副作用是什么。此外,这只是 3 级深层次结构 - 层次越多,它就越复杂。
如果requires transitive
对所有依赖项都是可传递的(正如传递这个词所暗示的那样),这将自动解决。如果没有transitive
,就只有一种方法可以解决这个问题。仅限于直接家属,有transitive
一些“选项”需要考虑,但似乎没有提供足够的信息供人们做出正确的选择。
java - 注释处理器自 java9 以来不工作
我有一些注释处理器在 Maven 项目中生成源文件。这按预期工作,但我正在尝试迁移到 java9,现在它们不再执行,或者我认为。
注释处理器通过以下方式注册
并在 module-info.java 中提供
但它不工作。我是否必须在 java9 中使用 maven 做一些额外的事情,还是应该像这样工作,我可能还有其他错误?