我正在一个简短的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时,我就已经有了它。这个相对容易解决,但是在这里我不知道怎么做。