Должен ли Gradle делать для каждого проекта локальную копию JAR-ов из mavenLocal ()? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть несколько библиотечных Java-проектов Gradle, которые я в настоящее время публикую в своем локальном репозитории Maven с задачей publishToMavenLocal. Я могу найти библиотеку с именем base file в моей локальной области .m2\repository\... и найти как (скажем):

  • ... lib\base\08.00.003-SNAPSHOT\base-08.00.003-SNAPSHOT.jar

Клиентский проект, socket_listener использует base и объявляет локальный репозиторий, как показано. Этот проект прекрасно работает и успешно запускается из командной строки Gradle.

repositories {
    mavenLocal()

    jcenter()
}

//  later in the file...
//
assemble.dependsOn      distDirectory

Выполнить ...

gradle socket_listener:run 
   :
       lots of logger output
   :

Проект socket_listener создает каталог dist для сборки socket_listener.jar с требуемыми зависимостями в папке lib/* для зависимостей с этим:

task distDirectory( type: Copy ) {
    into 'dist'
    from jar
    from 'src/dist'
    into( 'lib' )
    {
        from configurations.runtime
    }
}

Что я тоже считал нормальным, пока не попытался запустить свой проект слушателя из командной строки; это терпит неудачу таким образом.

 cd socket_listener\dist
 java -jar SocketListener.jar

Дает ошибку (настройка манифеста ниже):

 Error: Could not find or load main class example.app.cmd.SocketListener

И когда я проверял папку lib/ - НЕТ base-08.00.003-SNAPSHOT.jar должен был быть найден. Ни один из файлов mavenLocal JAR не находится в lib/. Это мое первое препятствие, программа не будет работать без этих mavenLocal JAR-ов.

Также настройки манифеста в Gradle - это просто копии из других рабочих проектов.

mainClassName = 'example.app.cmd.SocketListener'

    :

jar
{
    manifest
    {
        attributes( "Main-Class":       mainClassName )
        attributes( "Application-Name": "socket_listener" )
        attributes( "Class-Path":       'lib/' + ( configurations.runtime.collect { it.getName() }.join(' lib/') ) )
        attributes( "Codebase":         "*" )
        attributes( "Permissions":      "all-permissions" )
    }
}

Это не должно быть проблемой # 2.

Обнаружив base-08.00.003-SNAPSHOT.jar пропавших без вести из каталога lib/, я принялся искать этот файл. Угадай что?

ЕДИНСТВЕННОЕ место, где я обнаружил JAR-файл, находится в репозитории Maven, а именно:

dir /s/b  d:\*08.00.003-SNAPSHOT.jar
d:\.rep\.m2\repository\local\lib\driver_model\08.00.003-SNAPSHOT\driver_model-08.00.003-SNAPSHOT.jar
d:\.rep\.m2\repository\local\lib\base\08.00.003-SNAPSHOT\base-08.00.003-SNAPSHOT.jar

dir /s/b  d:\*08.00.003-SNAPSHOT.jar
File Not Found    

Что-то вроде команды linux find / -name "*08.00.003-SNAPSHOT.jar". Это все каталоги на ПК, сразу после успешного

gradle socket_listener:build -x test --refresh-dependencies
gradle socket_listener:run 

И обеспечение загрузки последних зависимостей. Из моего небольшого экспериментального результата совершенно ясно, что в сборке проекта Gradle используется библиотека JAR-ов непосредственно из репозитория - для build , для run , для test .

  • Это полностью НЕОБХОДИМО ...

Мои коллеги и я уверены, что другие локально созданные артефакты были кэшированы или, по крайней мере, локально сохранены в папке dist/. В этом примере base JAR нигде не копируется.

Можно ли принудительно (хотя бы) скопировать активы mavenLocal в папку lib/ и быть готовыми к использованию?

Кроме того, просматривая содержимое текущего * SocketListener.jar manifest Я не уверен, что все необходимые JAR-файлы были загружены. Для начала, то, что зависит от моего base JAR, также будет отсутствовать. Я чувствую, что других восходящих зависимостей там тоже нет.

Каков обычный процесс, обеспечивающий сбор всех зависимостей для сборки и запуска приложения командной строки Java из и Gradle и командной строки ??

Нормально ли использовать репозиторий maven таким образом?

Как это можно переопределить?

1 Ответ

0 голосов
/ 31 августа 2018
  • Я обнаружил, что configurations.runtime не то, что мне нужно.
  • Предложение from в задаче distDirectory должно

следующим образом

 task distDirectory( type: Copy ) {
     into 'dist'
     from jar
     from 'src/dist'
     into( 'lib' )
     {
         from configurations.from configurations.runtimeClasspath
     }
 }
  • runtimeClasspath дает мне все прямые зависимости для socket_listener.

Я не уверен, «как» build.gradle, из которого я взял эту модель для других проектов. Я ожидаю, что эти проекты создают инсталлятор, и мне не нужно явно использовать эту папку dist/.

Кроме того, после некоторого тестирования и экспериментов подтверждается, что этот JAR-файл не будет работать, если Манифест также не использует коллекцию runtimeClasspath (или compileClasspath), а именно

jar {
    manifest {
        attributes( "Main-Class": mainClassName )
        attributes( "Application-Name": "socket_listener" )
        attributes( "Class-Path": 'lib/' + ( configurations.runtimeClasspath.collect { it.getName() }.join(' lib/') ) )
        attributes( "Codebase": "*" )
        attributes( "Permissions": "all-permissions" )
    }
}

Однако я подозреваю, что это не всегда так. Основной класс SocketListener, вероятно, нуждается в отсутствующем JAR в runtimeClasspath для загрузки. Другие программы могут загружаться нормально. Они могут упасть с трассировкой стека, которая будет определять внешний вид Или просто работать хорошо.

Будет ли пусковая установка Java такой же, как nice .

Кстати, я не нашел ClassPath, упомянутый ни в одном из многих «простых примеров Gradle» для создания JAR, который работает там в Интернете. Хотя вы можете создавать без ClassPath, лучше иметь его для реального использования imho .

По практическим вопросам. Эта проблема возникла из-за того, что рассматриваемый файл build.gradle использует: implementation( ... ) спецификаций зависимостей вместо: compile( ... ) зависимостей.

Я смог подтвердить это, переместив одну зависимость из implementation в строку compile и использовав коллекцию runtime. Полученный JAR и lib/ имеют модуль, который я переместил.

Я оставляю то, что вы используете читателю. Вот несколько ссылок:

...