JDK 11.0.2-无法在ECLIPSE中派生模块描述符

时间:2019-08-24 05:04:31

标签: java eclipse module

我正在尝试运行其他人制作的项目。我将项目添加到eclipse中,它会自动生成一个module-info.java,由于模块是基于名称的,因此我会收到警告,所以我假设这可能是我的问题。我对模块不熟悉,并且很难理解在线上的一些资源。这是我的运行时错误。

Error occurred during initialization of boot layer
java.lang.module.FindException: Unable to derive module descriptor for C:\Users\under\Desktop\RSPS\Emerald\Server\lib\xpp3.jar
Caused by: java.lang.module.InvalidModuleDescriptorException: Provider class org.xmlpull.mxp1.MXParser,org.xmlpull.mxp1_serializer.MXSerializer not in module

这是我的module-info.java

/**
  * 
  */
/**
 * @author GameBeast
 *
 */
module server {
exports com.elvarg;
exports com.elvarg.net.packet;
exports com.elvarg.world.model.teleportation;
exports com.elvarg.world.model.dialogue;
exports com.elvarg.util;
exports com.elvarg.world.content.skills.Prayer;
exports com.elvarg.world.content.skills.Herblore;
exports fileserver.net;
exports com.elvarg.world.model.container;
exports fileserver.net.codec;
exports fileserver;
exports com.elvarg.world.entity.combat.method.impl.npcs;
exports com.elvarg.world.entity.impl.npc.bots;
exports com.elvarg.world.entity.impl.npc;
exports com.elvarg.world.collision.buffer;
exports com.elvarg.world.content;
exports com.elvarg.world.model.container.impl;
exports com.elvarg.net.login;
exports com.elvarg.net.security;
exports com.elvarg.world.model.equipment;
exports fileserver.cache;
exports com.elvarg.world.model.syntax;
exports com.elvarg.world.entity.combat;
exports com.elvarg.world.entity.impl;
exports com.elvarg.engine;
exports com.elvarg.world.grounditems;
exports com.elvarg.world.entity.combat.method.impl.specials;
exports com.elvarg.world.entity.combat.magic;
exports com.elvarg.net.channel;
exports com.elvarg.net.packet.impl;
exports com.elvarg.net.codec;
exports com.elvarg.definitions;
exports com.elvarg.world.entity.combat.ranged;
exports com.elvarg.world.entity.combat.method;
exports com.elvarg.world.content.clan;
exports com.elvarg.world.entity.impl.player;
exports com.elvarg.engine.task;
exports com.elvarg.world.entity.combat.method.impl;
exports com.elvarg.engine.task.impl;
exports com.elvarg.world.entity.updating;
exports com.elvarg.world.entity.impl.npc.bots.impl;
exports com.elvarg.world.entity;
exports com.elvarg.world.entity.combat.hit;
exports com.elvarg.world.model.syntax.impl;
exports com.elvarg.world.collision.region;
exports com.elvarg.world.entity.impl.object;
exports com.elvarg.world.entity.combat.bountyhunter;
exports com.elvarg.net;
exports com.elvarg.world.entity.combat.formula;
exports com.elvarg.world.model.movement.path;
exports com.elvarg.world.model;
exports com.elvarg.world.model.movement;
exports com.elvarg.world;

requires bzip2;
requires gson;
requires guava;
requires java.logging;
requires java.management;
requires netty.all;
requires xpp3;  
}

我的jar文件(重命名为xpp3,因为stackoverflow上的一个资源说该文件名的语法可能是一个问题)包含错误指出不是模块的文件,

org.xmlpull.mxp1.MXParser,org.xmlpull.mxp1_serializer.MXSerializer

所以我的问题是如何使用eclipse将它们添加到模块中?

此外,关于stackoverflow的另一篇文章说,请确保已配置构建路径,以使我的库位于模块路径而非类路径中,我也确保这样做。 https://prnt.sc/owu9r3

我已经尝试解决了几个小时,非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

错误显示为 Provider 类...不在模块中” ,这使我认为这与 Service Providers 有关。您应该阅读“ Java 9 Module Services”以了解有关该主题的更多信息。

服务提供者应在模块信息文件中使用provides关键字列出。这是文章中的示例:

module Provider {
    requires ServiceInterface;
    provides javax0.serviceinterface.ServiceInterface
      with javax0.serviceprovider.Provider;
}

module Consumer {
    requires ServiceInterface;
    uses javax0.serviceinterface.ServiceInterface;
}

module ServiceInterface {
    exports javax0.serviceinterface;
}

xpp3.jar库没有模块信息文件,因此JVM将动态构建一个文件,因此“无法派生模块描述符” 错误消息的一部分,但它会检测到错误。

我对该错误的最佳猜测是jar文件在META-INF/services/文件夹中包含一个ServiceLoader文件,该文件列出了错误消息中的2个类:org.xmlpull.mxp1.MXParser和{{ 1}}。但是,错误消息似乎表明这些类实际上不是 jar文件中。

检查org.xmlpull.mxp1_serializer.MXSerializer的内容,并检查是否存在这两个文件。另外查看xpp3.jar,看看我猜对了吗。

答案 1 :(得分:1)

xpp3.jar文件似乎已损坏

JAR文件包含提供者配置文件META-INF/services/org.xmlpull.v1.XmlPullParserFactory,其内容如下:

org.xmlpull.mxp1.MXParser,org.xmlpull.mxp1_serializer.MXSerializer

这两个提供程序类被指定为逗号分隔的列表,而不是每行一个类。参见Javadoc of ServiceLoader(我以黑体突出显示):

  

文件包含混凝土的全限定二进制名称列表   提供商类,每行一个

另请参见错误消息:它表示提供商类,而不是提供商类,并且,后没有空格因此它仅使用无效名称 org.xmlpull.mxp1.MXParser,org.xmlpull.mxp1_serializer.MXSerializer命名单个类

关于模块描述符的误导性错误消息表示services specified via META-INF/services/* files的实现(自Java 6起可用)已与JPMS services specified via the module-info.java file的新实现合并(自Java 9起可用)。这可能会导致在Java 9及更高版本中发生的错误在Java 8及更低版本中未发生,或者在较早的时间点(在启动应用程序时而不是在使用应用程序时)发生了错误。