【问题标题】:JDK 11.0.2 - Unable to derive module descriptor in ECLIPSE [duplicate]JDK 11.0.2 - 无法在 ECLIPSE 中派生模块描述符 [重复]
【发布时间】:2019-08-24 05:04:31
【问题描述】:

我正在尝试运行其他人制作的项目。我将项目添加到 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

我已经尝试解决这个问题几个小时了,非常感谢任何帮助。

【问题讨论】:

  • 你使用的是什么版本的 Eclipse?
  • 面向 Java 开发人员的 Eclipse IDE 版本:2018-12 (4.10.0) 内部版本号:20181214-0600
  • 问题不是由 Eclipse 引起的,而是由损坏的 JAR 文件引起的(请参阅下面的答案)。除此之外,Eclipse 2018-12 (4.10) 已经过时。当前的 Eclipse 版本是 2019-06 (4.12) 并提供improved UI to configure modules

标签: java eclipse java-module


【解决方案1】:

xpp3.jar 文件似乎已损坏

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

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

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

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

另请参阅错误消息:它说的是 Provider 类 而不是 Provider 类, 之后没有空格,所以它仅使用 无效名称 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 6 起可用)爪哇9)。这可能会导致在 Java 9 和更高版本中发生在 Java 8 和更低版本中没有发生的错误,或者在更早的时间点发生错误(在启动应用程序时而不是在使用它时)。

【讨论】:

    【解决方案2】:

    错误说Provider class ... not in module”,这让我觉得这是关于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 文件,其中列出了错误消息中的两个类:org.xmlpull.mxp1.MXParserorg.xmlpull.mxp1_serializer.MXSerializer。但是,错误消息似乎表明这些类实际上并不在 jar 文件中。

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

    【讨论】:

    • jar 文件xpp3.jar 确实包含org\xmlpull\mxp1\MXParserorg\xmlpull\mxp1_serializer 这些路径中的两个文件,META_INF 文件夹包含META_INF/services/org.xmlpull.v1.XmlPullParserFactory 其内容是org.xmlpull.mxp1.MXParser,org.xmlpull.mxp1_serializer.MXSerializer 我还在读那篇文章,但我想我会在此期间回复。
    • 所以你猜对了,ServiceLoader文件完好无损,但是provider文件在jar文件中各自的路径,没有丢失。我相信xpp3.jar 的接口是XmlSerializer,两个Provider 类是org.xmlpull.mxp1.MXParserorg.xmlpull.mxp1_serializer.MXSerializer,所以我应该将module-info.java 文件添加到xpp3.jar 中的这些目录中,并将我的服务器模块保留为消费者?
    • 错误消息没有列出 2 个类,而是一个具有无效名称 org.xmlpull.mxp1.MXParser,org.xmlpull.mxp1_serializer.MXSerializer 的类:请参阅我的答案。
    • @DavidPace 所以要修复它,修改META_INF/services/org.xmlpull.v1.XmlPullParserFactory,去掉逗号,并将两个类名放在不同的行上。
    • 更好的是,如果可能,请停止使用 XPP3 并改用 StAX。
    猜你喜欢
    • 2019-07-08
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多