#java #gradle
Вопрос:
Итак, название немного неудачно сформулировано, но у меня есть структура этого проекта:
Project
- A
- B
- org.ow2.asm:asm-commons:9.1
Где A и B-оба подпроекта проекта.
Проблема в том, что при компиляции A (B компилируется нормально) B перекомпилируется и выводит jar без зависимостей (даже если запущен плагин shadowJar).
Сборка проектов (упрощенная). gradle:
plugins {
id 'java'
id 'com.github.johnrengelman.shadow' version '6.1.0'
}
allprojects {
apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'
compileJava.finalizedBy(shadowJar)
shadowJar {
archiveClassifier.set('')
}
}
A (упрощенная) сборка.gradle:
dependencies {
implementation project(':B')
}
Сборка B (упрощенная). gradle:
dependencies {
implementation 'org.ow2.asm:asm-commons:7.3.1'
}
Итак, вывод показывает, что shadowJar запущен, но все равно выдает мне эту ошибку:
error: cannot access Remapper
class file for org.objectweb.asm.commons.Remapper not found
И в выходной банке в папке build/libs проекта B нет ASM, если я не создаю только проект B.
Единственный другой вопрос, который я видел с этой проблемой, был для Android и использовал API вместо реализации (которая, я думаю, предназначена только для Android).
Итак, как я могу решить эту проблему и заставить Gradle распознавать (и затенять) ASM?
РЕДАКТИРОВАТЬ: После дальнейшего тестирования, похоже, он ломается только в том случае, если A вызывает метод B, зависящий от ASM.
A может импортировать класс из B, который импортирует Remapper без ошибок, проблема заключается только в том, что указанный класс расширяет Remapper. Я нашел решение проблемы с лейкопластырем, просто внедрив ASM в проект A.
Комментарии:
1. Все еще работая над этим, как у gradle IntelliJ, так и у CLI gradle есть одна и та же проблема. Я пытался добавить shadowJar в задачи по умолчанию (читал где-то еще, что эта задача используется в подпроектах), но безуспешно.
2. Вы получаете ошибку во время выполнения или во время компиляции?
3. Время компиляции, а не время выполнения
4. Затем попробуйте применить плагин java-библиотеки и измените
implementation
его наapi
для зависимости ASM. Это означает, что он будет доступен для проекта A во время компиляции (в противном случае он доступен только во время выполнения).