Java模块系统与AspectJ

Java模块系统与AspectJ,java,Java,我有两个库,我已经迁移到Java10并使用了模块系统 首先让我担心的是我犯了很多错误,比如: 错误:java:未命名模块从aspectjrt和org.aspectj.weaver读取包org.aspectj.internal.lang.reflect。为了解决这个问题,我添加了requires org.aspectj.weaver到模块信息。事实上,我不得不在那里放很多我不用的东西,但比如Spring用的。直到那时我才能够编译它 最后,第一个库的模块信息如下所示: module my.lib1

我有两个库,我已经迁移到Java10并使用了模块系统

首先让我担心的是我犯了很多错误,比如:
错误:java:未命名模块从aspectjrt和org.aspectj.weaver读取包org.aspectj.internal.lang.reflect
。为了解决这个问题,我添加了
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;
}
对于第二个库,我还必须添加许多依赖项使用的lib,而不是我:

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回购协议中,并开始了第三个项目,这取决于这两个项目

module my.project {
    requires my.lib1;
    requires my.lib2;
}
现在我也犯了同样的错误<代码>错误:java:未命名模块从aspectjrt和org.aspectj.weaver中读取包org.aspectj.internal.lang.reflect
,但这次添加
需要org.aspectj.weaver没有帮助我注意到,当我只在模块中放置一个lib(不是两个都放在一起,而是一个lib1或lib2)时,它可以工作。

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

最重要的是:我如何解决我的项目的问题,这取决于我的两个LIB

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

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

在您的例子中,两个模块
aspectjrt
org.aspectj.weaver
都提供相同的包
org.aspectj.internal.lang.reflect
,这就是错误消息的来源(
未命名模块从aspectjrt和org.aspectj.weaver读取包org.aspectj.internal.lang.reflect

如何解决依赖于两个LIB的项目的问题

与此主题类似,您可以:

  • 打开包裹

  • 把它们捆在一个包裹里

  • 希望第三方模块将来成为命名模块

  • AspectJ已移植到模块系统。如果不使用最新版本(
    需要org.aspectj.runtime
    需要org.aspectj.weaver
    ),请选中它

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