оценка проектов и зависимостей - PullRequest
1 голос
/ 08 ноября 2019

Это определенно вопрос для начинающих, но я просто не могу заставить его работать.

У меня есть библиотека и приложение, которое зависит от библиотеки.

.
/ library
/ application

Iможете установить библиотеку через gradle install в ./library, затем получить приложение, зависящее от библиотеки через группу / имя / версию, и взять библиотеку через репозиторий mavenLocal() в приложении build.gradle, затем собратьприложение в папке application. И это работает.

Но я бы хотел, чтобы у меня был проект, и у меня могла бы быть одна команда для сборки приложения и, при необходимости, библиотека тоже (похоже на флаг maven -am).

Вот что у меня сейчас, в родительской папке, build.gradle:

subprojects {
  apply plugin: "java"
  repositories {
      mavenCentral()
  }
}

project(':application') {
  dependencies {
    compile project(':library')
  }
}

и в той же папке у меня settings.gradle:

include ':library', ':application'

Опять же, если я захожу в папку библиотеки и запускаю gradle install, это работает. Я получаю артефакт в моем ~/.m2.

Но теперь с описанной мной конфигурацией, если я иду в корневую папку и запускаю gradle shadowJar .. и задача shadowJar присутствует только в application,затем gradle пытается скомпилировать библиотеку, но терпит неудачу, по-видимому, потому, что она не определяет зависимости библиотеки.

* What went wrong:
Execution failed for task ':library:compileJava'.
> Compilation failed; see the compiler error output for details.

ошибки похожи, например:

Задача:библиотека: compileJava FAILED ... / DateTimeAdapter.java:5: ошибка: пакет javax.xml.bind.annotation.adapters не существует import javax.xml.bind.annotation.adapters.XmlAdapter;

и, конечно же, это зависимости в библиотеке / build.gradle =>

    implementation 'com.fasterxml.jackson.core:jackson-core:2.8.8'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.8'

Поэтому мой вопрос заключается в том, как указать зависимость приложения от библиотеки, чтобы я мог выполнить одну команду и получить mavenесли нужно, создайте библиотеку, а затем приложение. Я думал, что то, что я сделал, получило бы первую часть, но это не удалось, по-видимому, из-за транзитивных зависимостей библиотеки. Я действительно ожидаю, что мне нужно обработать вторую часть после этого, то есть как указать зависимость в приложении build.json. Возможно, мне придется перейти от указания координат группы / имени / версии maven к названию проекта, но я еще не дошел до этого.

Я бы определенно не хотел перечислять зависимости библиотеки в корневом граделеfile: мне бы хотелось, чтобы библиотека обрабатывала свои зависимости, и, применяя свои зависимости, я хотел бы, чтобы размер корневого файла gradle был небольшим.

1 Ответ

1 голос
/ 08 ноября 2019

application не может увидеть зависимости library, потому что вы объявили зависимости Джексона как реализацию деталь library.

То, что вы намеревались сделать, быловыставьте ваш library и его зависимости как api для потребителей.

Зависимости, объявленные в конфигурации реализация , можно рассматривать как «частные», то есть потребители вашегоlibrary не должен обращаться к методам / классам, которые используют эти зависимости, в противном случае они столкнутся с ошибками, такими как вы. api по сути является противоположностью реализации .

Конфигурация api доступна через плагин java-library.

Полный рабочий пример того, чего вы пытаетесь достичь (Kotlin DSL):

├── application
│   └── build.gradle.kts
├── build.gradle.kts
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── library
│   └── build.gradle.kts
└── settings.gradle.kts

Корневой проект build.gradle.kts:

subprojects {
    apply {
        plugin("java-library")
    }

    repositories {
        jcenter()
    }
}

settings.gradle.kts:

rootProject.name = "example-proj"

include("application")
include("library")

Библиотека build.gradle.kts:

dependencies {
    api("com.fasterxml.jackson.core:jackson-core:2.10.0")
    api("com.fasterxml.jackson.core:jackson-databind:2.10.0")
}

Приложение build.gradle.kts:

dependencies {
    implementation(project(":library"))

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...