我在一个简短的 Java 11 项目中使用 ASM 7.0,它使用以下代码将类文件转换为文本:
final var charset = StandardCharsets.UTF_8;
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
try (var pw = new PrintWriter(bos, false, charset)) {
final org.objectweb.asm.ClassVisitor traceClassVisitor = new TraceClassVisitor(null,
new org.objectweb.asm.util.Textifier(), new PrintWriter(bos));
new ClassReader(stream.getStream()).accept(traceClassVisitor,
ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES);
}
这可行,但是 Eclipse 有时会产生错误:无法解析类型 org.objectweb.asm.ClassVisitor。它是从所需的 .class 文件中间接引用的。清理和编译修复了这个问题。
使用 Maven 3.6.0 + Java 11 构建时,没有此类错误。
我module-info.java
的如下:
module stackoverflow.asm {
exports stackoverflow.asm;
// requires ransitive org.objectweb.asm;
// requires transitive org.objectweb.asm.tree;
requires transitive org.objectweb.asm.util;
// requires transitive org.objectweb.asm.tree.analysis;
uses java.nio.file.spi.FileSystemProvider;
}
在 Maven 中,我有以下依赖项:
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.0</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-util</artifactId>
<version>7.0</version>
</dependency>
</dependencies>
虽然我理解 Eclipse 报告的问题, org.objectweb.asm.util.Textifier
需要类org.objectweb.asm.ClassVisitor
,但 Eclipse 无法在类路径中找到它(或者我应该说模块路径?)。
它是 Eclipse 的错误(我使用的是最新版本)还是我的module-info.java
.
注意:如上所述,我理解错误;过去,当使用传递不良或没有依赖项的 maven 依赖项时,或者只是在已编译的项目中卸载 JDK 时,我已经拥有它。这相对容易解决,但在这里我不知道如何解决。