Compiling module-info.java throws error: module not found

Compiling module-info.java throws error: module not found

我正在将一个简单的应用程序转换为 java 模块。我还需要使这个应用程序自包含在它自己的自定义 JRE 中。我的应用程序依赖于多个现有的库 jar,我也正在将它们转换为模块化 jar。要构建自定义 JRE,我知道所有代码都必须在模块中。 (你不能引用非模块化的罐子。我很难找到它)。

问题是当我为一个依赖于另一个库 jar(我已经转换为模块化)的库 jar 编译模块时 info.java。它 returns "error: module not found:jersey.core"

我已经通过手动创建模块-info.java、编译它然后更新现有的 jar 来更新其中一个库 jar。

1).我创建的文件。

module jersey.core {
    exports com.sun.jersey.api.provider.jaxb;
    exports com.sun.jersey.api.representation;
    exports com.sun.jersey.api.uri;
    exports com.sun.jersey.core.header;
    exports com.sun.jersey.core.header.reader;
    exports com.sun.jersey.core.impl.provider.entity;
    exports com.sun.jersey.core.impl.provider.header;
    exports com.sun.jersey.core.impl.provider.xml;
    exports com.sun.jersey.core.osgi;
    exports com.sun.jersey.core.provider;
    exports com.sun.jersey.core.provider.jaxb;
    exports com.sun.jersey.core.reflection;
    exports com.sun.jersey.core.spi.component;
    exports com.sun.jersey.core.spi.component.ioc;
    exports com.sun.jersey.core.spi.factory;
    exports com.sun.jersey.core.spi.scanning;
    exports com.sun.jersey.core.spi.scanning.uri;
    exports com.sun.jersey.core.util;
    exports com.sun.jersey.impl;
    exports com.sun.jersey.localization;
    exports com.sun.jersey.spi;
    exports com.sun.jersey.spi.inject;
    exports com.sun.jersey.spi.service;
    exports javax.ws.rs;
    exports javax.ws.rs.core;
    exports javax.ws.rs.ext;

    requires java.base;
    requires java.desktop;
    requires java.logging;
    requires java.xml;
}

2).正在编译

"%JDK11_HOME%/bin/javac" --patch-module jersey.core=../originaljars/jersey-core-1.13.jar module-info.java

3).更新 jar

"%JDK11_HOME%/bin/jar" uf ../modules/jersey-core-1.13.jar -C jersey.core module-info.class

这是成功的。


起初我尝试创建没有 "depends on jersey.core" 的 jersey.client 模块-info.java。再次,经历了编译和更新 jar 的相同过程,但是当我将 jar 添加到我的项目时,Eclipse 在 MyTester.java.

中显示以下错误
The type javax.ws.rs.core.MediaType cannot be resolved. It is indirectly referenced from required .class files  MyTester.java   

这是针对 WebResource 对象(来自 jersey.client)调用方法 webResource.type("application/json") 的行抛出的,其中 return 一个 MediaType。

javax.ws.rs.core.MediaType 来自 jersey.core。所以这让我相信 jersey.client 需要要求 jersey.core.

然后我决定为 jersey.client
更新模块-info.java 我添加了一个要求 jersey.core.

module jersey.client {
    exports com.sun.jersey.api.client;
    exports com.sun.jersey.api.client.async;
    exports com.sun.jersey.api.client.config;
    exports com.sun.jersey.api.client.filter;
    exports com.sun.jersey.client.impl;
    exports com.sun.jersey.client.impl.async;
    exports com.sun.jersey.client.osgi;
    exports com.sun.jersey.client.proxy;
    exports com.sun.jersey.client.urlconnection;
    exports com.sun.ws.rs.ext;

    requires java.base;
    requires java.logging;
    requires jersey.core;
}

但是当我尝试编译它时,出现以下错误。

"%JDK11_HOME%/bin/javac" --patch-module jersey.client=../originaljars/jersey-client-1.13.jar module-info.java
module-info.java:15: error: module not found: jersey.core
requires jersey.core;
                   ^
1 error

想通了,这个错误实际上是在告诉我它找不到模块,所以我需要告诉它我的模块所在的位置。

 "%JDK11_HOME%/bin/javac" --patch-module jersey.client=../originaljars/jersey-client-1.13.jar module-info.java -p ../modules
module-info.java:15: error: module not found: jersey.core
requires jersey.core;
                   ^
1 error

然后我想也许我还需要显式添加模块。但这也没有用。

"%JDK11_HOME%/bin/javac" --patch-module jersey.client=../originaljars/jersey-client-1.13.jar module-info.java -p ../modules --add-modules jersey.core
 module-info.java:15: error: module not found: jersey.core
 requires jersey.core;
                   ^
 1 error

我是 Java 模块的新手,所以毫无疑问我在做一些愚蠢的事情。提前致歉:(

好吧,原来我确实做了一件蠢事。

1).您必须设置应用程序模块的模块路径。

2).您不能为路径使用相对链接。我将其更新为完整路径。

"%JDK11_HOME%/bin/javac" --patch-module jersey.client=../originaljars/jersey-client-1.13.jar module-info.java --module-path "C:{add your full path here}\modules"