Использование аннотаций Eclipse NonNull с несколькими проектами Gradle

avatar
CasaDelGato
1 июля 2021 в 17:49
84
1
0

Некоторое время мы использовали аннотации Eclipse @NonNull и @Nullable в нашем коде. Сейчас мы добавляем в нашу систему несколько проектов Spring, определенных с помощью Gradle. Эти проекты также будут иметь общий код с нашими автономными проектами.

Мы наблюдаем проблему, связанную с тем, что аннотации Eclipse (проверка времени компиляции) не работают, когда проект Spring/Gradle ссылается на общий код через сгенерированный Gradle файл .jar. Eclipse должен иметь источник общего jar-файла, чтобы аннотации работали. Присоединение исходного кода к проекту Eclipse работает только до тех пор, пока вам не потребуется выполнить обновление Gradle, поскольку при этом перестраиваются файлы eclipse .project и .classpath.

Также проблема заключается в том, что вам приходится явно перестраивать общий .jar каждый раз, когда вы вносите изменения в общий код. Это не делается автоматически.

Я не нашел способа, чтобы проекты Spring/Gradle просто использовали второй исходный каталог для общего кода, и мне не нужно было иметь общий код в виде сгенерированного файла .jar.

Есть ли хороший способ сделать общий код между несколькими проектами Gradle в Eclipse без использования промежуточного файла .jar? (Или какой-нибудь другой способ заставить работать аннотации Eclipse.)

Не совсем уверен, как привести полный пример, так как в основном это конфигурация gradle и eclipse.

Вот файлы конфигурации Gradle: settings.gradle

pluginManagement {
    repositories {
            maven { url 'https://repo.spring.io/milestone' }
            gradlePluginPortal()
    }
}
rootProject.name = 'App1-Account-Manager'

и build.gradle

plugins {
    id 'org.springframework.boot' version '2.5.0-RC1'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}
group = 'com.efi'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/milestone' }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.2'

    implementation 'org.springframework.boot:spring-boot-starter-amqp'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.amqp:spring-rabbit-test'

    implementation files('lib/eflow/eFlowClientApi.jar',
    'lib/eflow/eFlowCryptography.jar',
    'lib/eflow/json-simple-1.1.1.jar',
    'lib/eflow/commons-codec-1.4.jar',
    'lib/eflow/commons-io-2.6.jar',
    'lib/eflow/commons-lang-2.6.jar',
    'lib/eflow/commons-logging-1.2.jar',
    '../App1-Commons/build/libs/App1-Commons-0.0.1-SNAPSHOT.jar'
    )

    implementation group: 'org.eclipse.jdt', name: 'org.eclipse.jdt.annotation', version: '2.1.100'

    implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.7'

    runtimeOnly 'org.postgresql:postgresql'

    testImplementation 'org.springframework.security:spring-security-test'
}

test {
    useJUnitPlatform()
}

App1-Commons — это проект общего кода, от которого зависит множество других проектов. Вот где куча аннотаций @NonNull.

Я могу настроить проект App1-Account-Manager так, чтобы он зависел от проекта App1-Commons в eclipse, но как только вы запустите Gradle Refresh, он потеряет это соединение.

Я бы предпочел, чтобы исходный код из App1-Commons был включен в проект App1-Account-Manager, но я не понимаю, как настроить Gradle для этого с проектами Eclipse.

Источник
howlger
2 июля 2021 в 08:03
0

Похоже, что зависимость проекта осуществляется через созданный артефакт, а не напрямую ссылается на проект. Да, байт-код не содержит нулевой аннотации. Таким образом, исходный код или Javadoc должны быть прикреплены. Во всех случаях это должно быть возможно через Gradle. Пожалуйста, покажите минимальный воспроизводимый пример того, что у вас есть.

Ответы (1)

avatar
CasaDelGato
9 июля 2021 в 22:06
0

Кажется, я нашел решение. Мне нужно добавить блок SourceSets в файл build.gradle следующим образом:

sourceSets {
    main {
        java {
            srcDir 'src/main/java'
            srcDir '../App1-Commons/src/main/java'
        }
    }
}

И удалите ссылку на jar-файл App1-Commons.