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