在JMX控制台注册MBean时遇javax.management包多模块访问错误求助
我来帮你搞定这个头疼的模块冲突问题!虽然你说那个Java EE API的JAR本身不含javax.management包,但它的存在确实触发了冲突——原因其实很简单:
你的项目没有module-info.java,属于Java模块系统里的「未命名模块」,而JDK自带的java.management模块也提供了javax.management包。当Java EE API依赖(哪怕是间接)引入了包含相同包的其他JAR,或者它的存在让Eclipse的模块路径解析逻辑混乱时,就会抛出这个「包来自多个模块」的错误。
下面是几个具体的解决办法,你可以按顺序试试:
排查传递依赖
打开你的项目依赖配置(Maven的pom.xml或Gradle的build.gradle),查看依赖树,找找有没有哪个传递依赖偷偷打包了javax.management包。有些老旧的Java EE衍生库经常会干这种事。修改依赖作用域
如果这个Java EE API只是编译时需要,不需要打包到运行环境,把它的作用域改成provided(Maven)或者compileOnly(Gradle)。这样Eclipse编译时会用它,但不会把它和它的传递依赖加到运行类路径里,自然就不会和JDK的java.management模块撞车了。排除可疑的传递依赖
要是找到了带javax.management的传递依赖,直接在依赖声明里排除它。比如Maven里可以这么写:<dependency> <groupId>你的Java EE API组ID</groupId> <artifactId>你的Java EE API artifactID</artifactId> <version>对应版本</version> <exclusions> <exclusion> <groupId>冲突依赖的组ID</groupId> <artifactId>冲突依赖的artifactID</artifactId> </exclusion> </exclusions> </dependency>调整Eclipse的模块路径设置
右键项目 → 属性 → Java Build Path → 模块路径,看看是不是把Java EE API的JAR加到这里了。如果是,把它移到**类路径(Classpath)**里——未命名模块的依赖应该放在类路径,模块路径是给显式模块用的,放错地方就容易触发冲突。
内容的提问来源于stack exchange,提问作者Evandro Pomatti

