编译module-info.java会引发错误:找不到模块

时间:2019-08-21 06:42:51

标签: java module javac java-11

我正在将一个简单的应用程序转换为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模块还很陌生,所以毫无疑问我正在做一些愚蠢的事情。提前致歉:(

1 个答案:

答案 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"