我正在将一个简单的应用程序转换为Java模块。我还需要使该应用程序自包含在其自己的自定义JRE中。我的应用程序依赖于多个现有的库jar,我也正在将它们转换为模块化jar。要构建自定义JRE,我知道所有代码都必须位于模块中。 (您不能引用非模块化的jar。我很难做到这一点。)
问题是,当我为依赖于另一个库jar(已经转换为模块化)的一个库jar编译modules-info.java时。它返回“错误:未找到模块:jersey.core”
我已经通过手动创建module-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)。更新罐子
"%JDK11_HOME%/bin/jar" uf ../modules/jersey-core-1.13.jar -C jersey.core module-info.class
成功了。
首先,我尝试创建不带有“取决于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”),该方法返回MediaType。
javax.ws.rs.core.MediaType来自jersey.core。因此,我认为jersey.client需要使用jersey.core。
然后我决定更新jersey.client的module-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模块还很陌生,所以毫无疑问我正在做一些愚蠢的事情。提前致歉:(
答案 0 :(得分:0)
好吧,这让我们做了一些愚蠢的事情。
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"