Gradle зависимость между подпроектами - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь найти правильный способ объявления зависимости проекта в gradle, у меня есть два подпроекта:

Java-приложение

apply plugin: 'java'

sourceSets {main {java {srcDirs = ['./']}}}
dependencies{compile project(':p2')}

jar {manifest.attributes(
        'Class-Path': configurations.runtime.files.collect { it.name }.join(''),
        'Main-Class': 'Main'
    )
}

и библиотека Java:

apply plugin: 'java-library'

sourceSets {main {java {srcDirs = ['./']}}
}

jar {
   manifest.attributes(
    'Class-Path': configurations.runtime.files.collect { it.name }.join(' ')
)
}

Корневой проект пуст, а настройки просто включают подпроекты.

dependencies в проекте p1 только говорит о том, что p2 должен быть собран до p1, но как насчет настройки p2 как библиотеки для p1? Прямо сейчас, если прогон p1, я получил: Exception in thread "main" java.lang.NoClassDefFoundError: StaticClass

Сборка Gradle в порядке:

C:\...>gradle build
BUILD SUCCESSFUL in 1s
4 actionable tasks: 4 up-to-date

Мне нужно скопировать и вставить p2.jar в каталог p1.jar, чтобы он работал правильно, как я могу заставить gradle сделать это для меня?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

В зависимости от ваших конкретных потребностей, вы должны взглянуть на плагин java-library-distribution или плагин application .

  • Первыйодин упакует jar и его зависимости в архив.
  • Второй сделает то же самое и позволит настроить основной jar для выполнения.
0 голосов
/ 26 апреля 2018

Если вы пытаетесь упаковать классы из p2 в p1 банку, попробуйте добавить это в p1 build.gradle:

jar {
    from project(':p2:').sourceSets.main.output
}

Хотя это немного необычно. Обычно, если вы настроили отдельный библиотечный проект, вы упаковываете его в отдельный jar-файл и добавляете его в classpath зависимых проектов, чтобы его можно было повторно использовать.

Установка Class-Path в манифесте фляги не будет работать так, как вы написали. Атрибут манифеста интерпретирует каждую запись как путь к файлу относительно рабочего каталога JVM, но вы просто даете ему имя каждого jar, а Gradle не делает любое копирование или перемещение файлов при настройке пути к классам конфигурации. Как правило, не стоит полагаться на манифест для установки пути к классам, поскольку он будет работать только в том случае, если ваши файлы jar расположены в файловой системе точно так, как этого ожидает манифест. Если это действительно то, что вам нужно, то вам нужно создать каталог «install», содержащий все необходимые файлы jar, расположенные, как и ожидалось. Плагин Gradle Application , вероятно, может помочь вам достичь этого или чего-то подобного, но я никогда не использовал его.

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