0

我在一个简短的 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 时,我已经拥有它。这相对容易解决,但在这里我不知道如何解决。

4

0 回答 0