标签: module-info

module-info.java 不适用于 Java 9 中的 lombok

我在将项目迁移到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 …

lombok java-9 java-module module-info

5
推荐指数
2
解决办法
4462
查看次数

创建 module-info.java 后无法使用未命名模块中的类

我正在尝试将旧的 java 项目迁移到 java 9,并且最好尝试新的 module-info.java 功能。该项目使用 Maven 依赖项,据我所知,这些依赖项将 .jar 迁移为未命名模块。替换一些折旧的库后,项目本身运行良好,但当我尝试添加 module-info.java 文件时出现问题。它不再能够与任何 Maven 导入进行交互。我对未命名模块的理解是否错误?我认为它们能够与同一项目中的命名/自动模块共存。如果不是,为什么我在创建 module-info.java 后无法从 Maven 依赖项导入类?

eclipse maven java-9 module-info

5
推荐指数
1
解决办法
1676
查看次数

如何在jdk8和jdk9上使用不安全的java8代码?

sun.misc.Unsafe在我的Java8代码库中使用.这不适用于Java9.

我想修复Java9,但使用与Java8相同的代码库.如果我放module-info.java,它将无法工作,因为我的代码库是Java8.

该怎么办?

java unsafe java-8 java-9 module-info

5
推荐指数
1
解决办法
403
查看次数

未命名模块与 ServiceLoader::load 的命名模块交互

我有一个这样的项目:

\---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)

java java-9 java-module module-info

5
推荐指数
1
解决办法
7076
查看次数

列出应用程序启动期间解析的模块

如何在启动应用程序时了解已解析的模块列表,以便确定从根模块可以访问的所有服务提供程序.

java java-9 java-module module-info

5
推荐指数
1
解决办法
848
查看次数

Java:不推荐使用`sun.awt.image`包吗?

我想要使​​用sun.awt.image.PNGImageDecoder在我的项目中使用的一些代码.问题是源代码基于Java 8和我的项目使用JDK 9+(11).所以我收到了这个错误:

包' sun.awt.image'在模块' java.desktop'中声明,它不会将其导出到未命名的模块.

import sun.awt.image.*,和:

符号在模块' java.desktop'中声明,它不导出包' sun.awt.image'

使用PNGImageDecoderImageDecoder

在寻找解决方案的一些努力之后,我发现了一些类似的情况,建议添加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

5
推荐指数
2
解决办法
1193
查看次数

Java 9:ServiceLoader 不从测试源(模块)加载测试实现

我正在使用Java9模块系统(在openjdk11上运行)

我有

  • 从 Java8 迁移,代码包含使用 ServiceLoader 机制的类。
  • 此类的单元测试尝试加载两个测试服务实现

  • 测试实现列在 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 unit-testing serviceloader java-9 module-info

5
推荐指数
1
解决办法
1062
查看次数

如何将 json 的 maven 依赖项添加到 &gt;= Java 9 中的模块

在 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 json maven java-platform-module-system module-info

5
推荐指数
0
解决办法
1560
查看次数

如何从非模块化依赖项的 GAV 坐标中编写 module-info requires 语句?

我正在将旧的 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)

模块名称xomjOpenDocument不足。但是我不知道这些依赖项应该是什么,也不知道如何重新配置​​ Gradle;如果那是我需要做的。

当我省略任一requires语句时,相应的imports 无法解析。我没有查看 JAR 文件。但我不认为任何一个工件是模块化的。

我正在使用 Gradle 5.6.2,我的目标是 Java 11。

java java-platform-module-system java-module module-info java-11

5
推荐指数
0
解决办法
115
查看次数

VM 因具有 module-info.java 的 maven-surefire-plugin 崩溃

最初,我在下一个文件夹中有一个独特的模块信息: src/main/java/module-info.java.

我能够成功运行测试。

现在我需要覆盖,module-info因为我需要添加一些仅与测试相关的更改。更改是关于打开模块。我在这里添加这个新内容module-info.javasrc/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)

java maven-surefire-plugin module-info

5
推荐指数
1
解决办法
1304
查看次数