java - 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的责任吗?)。
最重要的是:如何解决依赖于我的两个库的项目问题?
解决方案
我注意到当我只将其中一个库放在模块中时(不是两个放在一起,而是一个 lib1 或 lib2)它可以工作。
使用模块系统,一个包只能由当前模块图中的单个模块提供。这是引入模块系统的主要原因之一:避免模棱两可的依赖关系(因为它们出现在经典的类路径上;称为拆分包)。这就是为什么它只适用于您的一个模块的原因。
在您的情况下,两个模块aspectjrt
都org.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 写给这个话题一样,你可以:
拆包
将它们捆绑在一个包中
希望第三方模块将来成为命名模块。
AspectJ 已移植到模块系统。检查最新版本,如果你不使用它(requires org.aspectj.runtime
,requires org.aspectj.weaver
)?
此外,您可以在此处找到有关模块系统的更多信息。
推荐阅读
- python - Python:我需要创建一个具有特定规范的随机 NxN 矩阵
- python - 从 youtube 视频中提取音频
- blender - Blender 2.8 snap,刀工具不能正常工作
- c++ - 最小硬币变化 - 动态规划
- c - 为什么我可以像这样将值传递给 printf C 函数?
- c# - 如何在 C# 文本框中显示 python 输出?
- oracle - Oracle Forms 中的 For 循环
- c++ - c++ 调用参数排序 argc, argv[]
- python - 按最后一个值拆分 np 元组数组,但前提是其余元组匹配
- python - 气流initdb:未定义符号:Py_GetArgcArgv