Ограничения доступа в нескольких проектах 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.