Java 模块系统和 AspectJ

标签 java

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

让我担心的第一件事是我遇到了很多错误,例如: 错误: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;
}

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

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,但这时间,添加 requires org.aspectj.weaver; 没有帮助。 我注意到,当我只将其中一个库放入模块时(不是两个都放在一起,而是一个 lib1 或 lib2),它会起作用。

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

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

最佳答案

I have noticed when I put only one of the libs in the module (not both together, but one lib1 or lib2) it works.

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

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

how do I fix the problem with my project which depends on my two libs?

喜欢Andy Guibert wrote对于这个话题,你可以:

  1. 解包

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

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

AspectJ 已经移植到模块系统。查看最新version ,如果您不使用它(需要 org.aspectj.runtime需要 org.aspectj.weaver)?

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

关于Java 模块系统和 AspectJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50894265/

相关文章:

java - Java中从字符串中提取子字符串

java - 解决Tomcat中的Bind异常

java - HTTP 错误代码,导致 IOException - 如何访问响应?

java - 签署 jar 文件时,签名文件 (*.SF) 的用途是什么?

java - 从图像中提取图像

java - 如何更改实际复选框内 J 复选框的背景颜色

Java 泛型类的方法不适用于传递的参数

java - 如何计算BitSet对象中的总位数?

java - Spring-boot + Hibernate + JPA 与 transient 字段

java - Android studio : Unable to detect adb version, 退出值 0xc0000135