У меня есть несколько библиотечных 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 таким образом?
Как это можно переопределить?