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

JDK 11.0.2 - Unable to derive module descriptor in ECLIPSE

我正在尝试 运行 其他人制作的项目。我将项目添加到 eclipse 中,它自动生成了一个模块-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

这是我的模块-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 因为 Whosebug 上的资源说文件名的语法可能有问题)包含错误说不是模块的文件,

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

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

此外,Whosebug 上的另一个 post 说要确保构建路径已配置,以便我的库在我的模块路径中而不是我的类路径中,我也确保这样做。 https://prnt.sc/owu9r3

几个小时以来我一直在努力解决这个问题,非常感谢任何帮助。

错误显示 "Provider class ... 不在模块中",这让我觉得这是关于 服务提供商。您应该阅读“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 将动态构建一个,因此 "Unable to derive module descriptor" 部分错误消息,但它检测到错误。

我对错误的最佳猜测是 jar 文件在 META-INF/services/ 文件夹中包含一个 ServiceLoader 文件,它在错误消息中列出了 2 classes:org.xmlpull.mxp1.MXParserorg.xmlpull.mxp1_serializer.MXSerializer。但是,错误消息似乎表明那些 classes 实际上并不 jar 文件中。

检查 xpp3.jar 的内容,并检查这两个文件是否存在。另请查看 META-INF/services/ 以查看我是否猜对了。

看来 xpp3.jar 文件已损坏:

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

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

两个提供程序 class 被指定为 逗号分隔列表,而不是每行一个 class 。请参阅 Javadoc of ServiceLoader(我用粗体突出显示):

The file contains a list of fully-qualified binary names of concrete provider classes, one per line.

另请参阅 错误消息:它说 Provider class 而不是 Provider classes 并且 , 之后没有 space 所以它只命名 单个 class无效名称 org.xmlpull.mxp1.MXParser,org.xmlpull.mxp1_serializer.MXSerializer.

关于 模块描述符 的误导性错误消息暗示 services specified via META-INF/services/* files (available since Java 6), has been merged with the new implementation of JPMS services specified via the module-info.java file 的实现(自 Java 9 起可用)。这可能会导致在 Java 9 和更高版本中发生在 Java 8 和更低版本中没有发生的错误,或者在更早的时间点发生错误(已经在启动应用程序时而不是在使用它时) ).