首页 > 解决方案 > Java 模块系统和 AspectJ

问题描述

我有 2 个库,已迁移到 Java 10 并使用了模块系统。

让我担心的第一件事是我有很多错误,例如: Error:java: the unnamed module reads package org.aspectj.internal.lang.reflect from both aspectjrt and org.aspectj.weaver. 为了解决这个问题,我添加requires org.aspectj.weaver;了模块信息。实际上,我不得不放很多其他我不使用的东西,但例如 Spring 使用。只有这样我才能编译它。

所以最后,我的第一个库的模块信息如下所示:

module my.lib1 {
    requires spring.context;
    requires spring.core;
    requires spring.context.support;
    requires spring.beans;
    requires org.aspectj.weaver;
    requires slf4j.api;
    requires metrics.core;
    requires com.fasterxml.jackson.databind;
    requires java.validation;
    requires org.hibernate.validator;
    requires javax.el;

    exports my.lib1;
}

对于第二个库,我还必须添加很多依赖项使用的库,而不是我:

module my.lib2 {
    requires org.hibernate.orm.core;
    requires java.sql;
    requires java.persistence;
    requires spring.context;
    requires spring.tx;
    requires spring.orm;
    requires spring.data.jpa;
    requires spring.beans;
    requires HikariCP;
    requires metrics.core;
    requires slf4j.api;
    requires spring.core;

    exports my.lib2;
}

两个库现在都在编译。我把它们放在我当地的 mvn repo 中,并开始了依赖于这两个的第三个项目。

module my.project {
    requires my.lib1;
    requires my.lib2;
}

现在我得到了同样的错误...... Error:java: the unnamed module reads package org.aspectj.internal.lang.reflect from both aspectjrt and org.aspectj.weaver,但这一次,添加requires org.aspectj.weaver;没有帮助。我注意到当我只将其中一个库放在模块中时(不是两个放在一起,而是一个 lib1 或 lib2)它可以工作。

我必须在我的模块信息中放置不同的库,这些库不是由我使用而是由其他依赖项使用,这是否正常?(例如,要求aspectj不应该是Spring的责任吗?)。

最重要的是:如何解决依赖于我的两个库的项目问题?

标签: java

解决方案


我注意到当我只将其中一个库放在模块中时(不是两个放在一起,而是一个 lib1 或 lib2)它可以工作。

使用模块系统,一个包只能由当前模块图中的单个模块提供。这是引入模块系统的主要原因之一:避免模棱两可的依赖关系(因为它们出现在经典的类路径上;称为拆分包)。这就是为什么它只适用于您的一个模块的原因。

在您的情况下,两个模块aspectjrtorg.aspectj.weaver提供相同的包org.aspectj.internal.lang.reflect,这就是错误消息的来源(the unnamed module reads package org.aspectj.internal.lang.reflect from both aspectjrt and org.aspectj.weaver)。

如何解决取决于我的两个库的项目问题?

就像Andy Guibert 写给这个话题一样,你可以:

  1. 拆包

  2. 将它们捆绑在一个包中

  3. 希望第三方模块将来成为命名模块。

AspectJ 已移植到模块系统。检查最新版本,如果你不使用它(requires org.aspectj.runtimerequires org.aspectj.weaver)?

此外,您可以在此处找到有关模块系统的更多信息。


推荐阅读