Ограничения доступа в нескольких проектах Eclipse с помощью Gradle
У меня есть проект Gradle в Eclipse, состоящий из нескольких подпроектов. В настоящее время у меня есть подпроекты A, B и C.
Проект A должен иметь доступ к проекту B. Проект B должен иметь доступ к проекту C. Но проект A не должен иметь доступ к проекту C.
A -> B, B -> C, but not A -> C
Я легко могу проверить это, имея класс java example в Project A, который пытается использовать класс из Project C.
Я достиг этого с помощью Gradle, используя следующую настройку в основном файле build.gradle
и используя свойство transitive
:
project(':projectA') {
dependencies {
compile project(':projectB'), {
transitive = false
}
}
}
project(':projectB') {
dependencies {
compile project(':projectC'), {
transitive = false
}
}
}
Запуск Gradle compileJava
в проекте. Примерный класс дает правильное сообщение об ошибке. Я хотел бы, чтобы эта ошибка возникла как ошибка компиляции в Eclipse. Мне также удалось вручную настроить путь к классам таким образом, чтобы было выполнено требуемое соотношение, но Gradle Refresh/Rebuild снова сбрасывает путь к классам.
Можно ли использовать компилятор Gradle Java вместо компилятора Eclipse? Или я должен влиять на файлы classpath при выполнении Gradle Refresh/Rebuild? Возможно ли другое решение?
Я хотел бы услышать, какой предпочтительный подход для этой ситуации. Спасибо!
Ответы
Ответ 1
Вы можете использовать плагин gradle eclipse для изменения параметров проекта eclipse из gradle, включая изменения в пути к классам eclipse. Я бы попробовал что-то вроде этого в build.gradle:
allprojects{
apply plugin:'eclipse'
eclipse.classpath.file {
beforeMerged { classpath -> classpath.entries.removeAll{it} }
}
}
а затем запустите gradle eclipseClasspath
, чтобы повторно создать файл .classpath и общее обновление /F 5 в eclipse, чтобы получить измененный файл .classpath.
Демо:
Я начинаю с transitive=true
в build.gradle. Когда класс в создает экземпляр класса в C, я не получаю ошибки компиляции.
![введите описание изображения здесь]()
Теперь я перехожу к transitive=false
в build.gradle. Это приводит к сбоям компиляции из командной строки, но eclipse доволен старой информацией о зависимостях. Right-Click → Gradle → Refresh Project не влияет. Чтобы сделать gradle забрать изменение, запустите gradle eclipseClasspath
gradle eclipseClasspath
:eclipseClasspath
:A:eclipseClasspath
:B:eclipseClasspath
:C:eclipseClasspath
и Eclipse возьмет измененные файлы .classpath, выполнив обновление.
![введите описание изображения здесь]()
Что заставляет eclipse распознавать недостающие транзиты и бросать ошибки компиляции:
![введите описание изображения здесь]()
Мой полный root build.gradle на этом этапе:
allprojects{
apply plugin:'java'
apply plugin:'eclipse'
eclipse.classpath.file {
beforeMerged { classpath -> classpath.entries.removeAll {it} }
}
}
project(':A').dependencies {
compile project(':B'),{ transitive = false }
}
project(':B').dependencies {
compile project(':C'),{ transitive = false }
}
Ответ 2
Единственный способ, которым я смог достичь этого, - обратиться к файлам классов проекта, таким образом:
project(':projectA') {
dependencies {
compile files("../projectB/build/classes/main")
}
}
Путь ../projectB/build/classes/main
должен указывать на то, где файлы классов создаются и сохраняются в вашем проекте.
Я также рассмотрел замену компилятора Eclipse компилятором Gradle, но в настоящее время он не поддерживается Eclipse.