我在将项目迁移到Java 9 时遇到了问题。
更新 Java 9 后,我尝试运行项目,但遇到编译器错误:-
Error:(6, 1) java: package javax.annotation is not visible
(package javax.annotation is declared in module java.xml.ws.annotation, which is not in the module graph)
Run Code Online (Sandbox Code Playgroud)
但我找到了解决方法。我添加了lombok.config文件。
然后将module-info.java文件添加到项目编译器后再次显示错误
Error:(10, 26) java: variable title not initialized in the default constructor
Run Code Online (Sandbox Code Playgroud)
项目示例:
我们有实体Store:
@AllArgsConstructor
@Getter
public class Story {
private final String title;
}
Run Code Online (Sandbox Code Playgroud)
在 root 的包中,我有module-info.java内容:
module javanine {
requires lombok;
}
Run Code Online (Sandbox Code Playgroud)
在 root 的项目中,我有 lombok.config …
我正在尝试将旧的 java 项目迁移到 java 9,并且最好尝试新的 module-info.java 功能。该项目使用 Maven 依赖项,据我所知,这些依赖项将 .jar 迁移为未命名模块。替换一些折旧的库后,项目本身运行良好,但当我尝试添加 module-info.java 文件时出现问题。它不再能够与任何 Maven 导入进行交互。我对未命名模块的理解是否错误?我认为它们能够与同一项目中的命名/自动模块共存。如果不是,为什么我在创建 module-info.java 后无法从 Maven 依赖项导入类?
我sun.misc.Unsafe在我的Java8代码库中使用.这不适用于Java9.
我想修复Java9,但使用与Java8相同的代码库.如果我放module-info.java,它将无法工作,因为我的代码库是Java8.
该怎么办?
我有一个这样的项目:
\---main
\---src
\---com.foo
\---UnnamedStart.java
\---api
\---src
\---com.foo.api
\---ApiInterface.java
\---module-info.java
\---impl
\---src
\---com.foo.impl
\---ApiInterfaceImpl.java
\---module-info.java
Run Code Online (Sandbox Code Playgroud)
的实现UnnamedStart.java是:
public static void main(String[] args) {
ServiceLoader<ApiInterface> services = ServiceLoader.load(ApiInterface.class);
...
}
Run Code Online (Sandbox Code Playgroud)
请注意,main是未命名的模块。
api/src/module-info.java 是:
module com.foo.api {
exports com.foo.api;
}
Run Code Online (Sandbox Code Playgroud)
并且impl/src/module-info.java是:
更新 1.1 - 下面的代码更新见评论,添加requires
更新 1.2 - 下面的代码已更新,在创建问题时provides A with B更改为provides B with A错误,原本没问题
module com.foo.impl {
requires com.foo.api; //added (update 1.1)
provides com.foo.impl.ApiInterface
with com.foo.api.ApiInterfaceImpl; //vice versa (update 1.2)
} …Run Code Online (Sandbox Code Playgroud) 如何在启动应用程序时了解已解析的模块列表,以便确定从根模块可以访问的所有服务提供程序.
我想要使用sun.awt.image.PNGImageDecoder在我的项目中使用的一些代码.问题是源代码基于Java 8和我的项目使用JDK 9+(11).所以我收到了这个错误:
包'
sun.awt.image'在模块'java.desktop'中声明,它不会将其导出到未命名的模块.
为import sun.awt.image.*,和:
符号在模块'
java.desktop'中声明,它不导出包'sun.awt.image'
使用PNGImageDecoder或ImageDecoder等
在寻找解决方案的一些努力之后,我发现了一些类似的情况,建议添加requires java.desktop;到module-info.java文件(像这种情况和这种情况).但是当我意识到这个解决方案只有在你的项目已经有一个module-info.java文件并且你遗漏了一个用过的模块时才有用.
我的项目已经没有此文件(请注意第一条错误消息中的" 未命名模块 ").据我所知,这意味着所有模块都是自动导入的.所以添加这个文件并添加该行没有任何影响,除了(更改错误消息和)导致我的代码的其他部分出现一些类似的问题(当然,这可以通过向module-info.java文件添加所需的模块来解决).
确保我在jmods文件夹(JDK 11)中导入了所有模块,但问题没有解决:
requires java.base;
requires java.compiler;
requires java.datatransfer;
requires java.desktop;
requires java.instrument;
requires java.logging;
requires java.management;
requires java.management.rmi;
requires java.naming;
requires java.net.http;
requires java.prefs;
requires java.rmi;
requires java.scripting;
requires java.se;
requires …Run Code Online (Sandbox Code Playgroud) java java-platform-module-system java-9 java-module module-info
我正在使用Java9模块系统(在openjdk11上运行)
我有
此类的单元测试尝试加载两个测试服务实现
测试实现列在 META-INF/services 文件中
src/main/example/Service.java
public interface Service {
public static List<Service> loadServices(){
return StreamSupport.stream(ServiceLoader.load(Service.class).spliterator(),false)
.collect(Collectors.toList());
}
}
Run Code Online (Sandbox Code Playgroud)
和一个
src/main/module-info.java
module example {
uses example.Service;
exports example;
}
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的单元测试
src/main/example/ServiceTest.java
public ServiceTest {
@Test
void loadServices_should_find_TestServices{
List<Service> services = Service.loadServices();
assertEquals(2, services.size());
}
}
Run Code Online (Sandbox Code Playgroud)
我在测试源中有两个测试服务:
src/main/example/TestService1.java
public TestService1 implements Service {}
Run Code Online (Sandbox Code Playgroud)
src/main/example/TestService2.java
public TestService2 implements Service {}
Run Code Online (Sandbox Code Playgroud)
src/test/resources/META-INF/services/example.Service
example.TestService1
example.TestService2
Run Code Online (Sandbox Code Playgroud)
我使用 maven-surefire-plugin 3.0.0-M3 没有任何特定配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)
它正确地修补了示例模块(来自surefireargs文件)
--patch-module example="D:\\git\\example\\target\\test-classes"
Run Code Online (Sandbox Code Playgroud)
当我直接在IntelliJ中执行测试时,测试运行成功,找到了两个服务。但是,当我在maven中构建模块并通过surefire执行测试时,它找不到服务并且测试失败。 …
在 java 8 项目中,您只需在 maven 中添加以下依赖项
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
使用 OpenJDK、Eclipse 2018-12
和 maven 模块,导致在 module-info.java 中出现错误:
包 javax.json.stream 可以从多个模块访问:java.json、org.glassfish.java.json
所以在这两个依赖项目中都有一个名为 javax.json.stream 的包,由于 jigsaw 模块系统,这不再被允许?
如何解决这个问题?
编辑:
我将 maven 依赖项更新为 1.1.4 并将它们放在类路径上。该javax.json-api有module-info.java文件和工作正常,日食显示没有更多的错误。
但是现在javax.json (org.glassfish)没有找到实现的packages ,导致一个ClassNotFoundException: org.glassfish.json.JsonProviderImpl
What more can I do?
编辑:
它现在可以工作了,我忘了在这个项目中生成一个 module-info.java。
我正在将旧的 Java 应用程序转换为模块化的应用程序。它是一个 Gradle 项目,依赖项如下所示:
dependencies {
implementation 'org.jopendocument:jOpenDocument:1.3'
implementation 'xom:xom:1.3.2'
}
Run Code Online (Sandbox Code Playgroud)
在 App 类中,我的导入是:
dependencies {
implementation 'org.jopendocument:jOpenDocument:1.3'
implementation 'xom:xom:1.3.2'
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个 module-info.java 文件。但是当我这样做时,我的应用程序将无法编译,因为requiresmodule-info 文件中的指令是错误的。
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Serializer;
import org.jopendocument.dom.spreadsheet.MutableCell;
import org.jopendocument.dom.spreadsheet.Sheet;
import org.jopendocument.dom.spreadsheet.SpreadSheet;
Run Code Online (Sandbox Code Playgroud)
模块名称xom和jOpenDocument不足。但是我不知道这些依赖项应该是什么,也不知道如何重新配置 Gradle;如果那是我需要做的。
当我省略任一requires语句时,相应的imports 无法解析。我没有查看 JAR 文件。但我不认为任何一个工件是模块化的。
我正在使用 Gradle 5.6.2,我的目标是 Java 11。
java java-platform-module-system java-module module-info java-11
最初,我在下一个文件夹中有一个独特的模块信息:
src/main/java/module-info.java.
我能够成功运行测试。
现在我需要覆盖,module-info因为我需要添加一些仅与测试相关的更改。更改是关于打开模块。我在这里添加这个新内容module-info.java:
src/main/test/module-info.java。
如果我用它执行测试,我会收到下一个错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M4:test (default-test) on project myProject: There are test failures.
[ERROR]
[ERROR] Please refer to /home/xxxxxx/workspace/myProject/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /home/xxxxxx/workspace/myProject && /home/xxxxxx/programs/java/jdk-11.0.10/bin/java --add-reads org.eclipse.yasson=ALL-UNNAMED --add-opens org.eclipse.yasson/org.eclipse.yasson.internal.cdi=ALL-UNNAMED --add-exports org.eclipse.yasson/org.eclipse.yasson.internal.cdi=java.naming @/home/xxxxxx/workspace/myProject/target/surefire/surefireargs1904933309274673454 …Run Code Online (Sandbox Code Playgroud) module-info ×10
java ×8
java-9 ×7
java-module ×5
java-platform-module-system ×3
maven ×2
eclipse ×1
java-11 ×1
java-8 ×1
json ×1
lombok ×1
unit-testing ×1
unsafe ×1