Я использую ASM 7.0 в коротком проекте Java 11, который преобразует файл класса в текст, используя следующий код:
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 в уже скомпилированном проекте. Это было относительно легко исправить, но здесь я не знаю как.