У меня на машине установлена Java 17 и Gradle 8.3.
Я создаю новый проект библиотеки Java, используя:
gradle init --type java-library
Я следую подсказкам, и он создает проект со структурой каталогов, которая выглядит следующим образом:
myapp/
lib/
src/main/java/<some-generated-java-code-here>
build.gradle
gradle.properties
settings.gradle
Я запускаю gradle wrapper
, затем захожу в build.gradle
и добавляю несколько зависимостей, придавая этому вид:
plugins {
id 'java-library'
}
group 'me.myself'
version '24.0.2'
repositories {
mavenCentral()
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation (
'com.google.guava:guava:32.1.1-jre'
,'org.keycloak:keycloak-core'
,'org.keycloak:keycloak-server-spi'
,'org.keycloak:keycloak-server-spi-private'
,'org.keycloak:keycloak-services'
,'org.jboss.logging:jboss-logging'
,'org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec'
)
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
jar {
archiveBaseName = 'myapp-keycloak-customizer'
archiveVersion = '24.0.2'
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
Внутри IntelliJ я собираюсь построить проект, просто чтобы добавить/разрешить новые зависимости, и получаю следующую ошибку:
:lib:main: Could not find org.keycloak:keycloak-core:.
Required by:
project :lib
Я проверил, что org.keycloak:keycloak-core
является допустимой записью для Maven Central. Кроме того, как вы увидите ниже, он даже не может найти журнал JBoss Logging, так что это не проблема зависимостей Maven или Keycloak. Я также могу убедиться, что у меня есть полный Wi-Fi и нет проблем с сетью.
Итак, из терминала я запускаю ./gradlew build --debug
и получаю массу вывода, интересная часть которого такова:
[ERROR] [o.g.i.b.BuildExceptionReporter] FAILURE: Build failed with an exception.
[ERROR] [o.g.i.b.BuildExceptionReporter]
[ERROR] [o.g.i.b.BuildExceptionReporter] * What went wrong:
[ERROR] [o.g.i.b.BuildExceptionReporter] Execution failed for task ':lib:compileJava'.
[ERROR] [o.g.i.b.BuildExceptionReporter] > Could not resolve all files for configuration ':lib:compileClasspath'.
[ERROR] [o.g.i.b.BuildExceptionReporter] > Could not find org.keycloak:keycloak-core:.
[ERROR] [o.g.i.b.BuildExceptionReporter] Required by:
[ERROR] [o.g.i.b.BuildExceptionReporter] project :lib
[ERROR] [o.g.i.b.BuildExceptionReporter] > Could not find org.keycloak:keycloak-server-spi:.
[ERROR] [o.g.i.b.BuildExceptionReporter] Required by:
[ERROR] [o.g.i.b.BuildExceptionReporter] project :lib
[ERROR] [o.g.i.b.BuildExceptionReporter] > Could not find org.keycloak:keycloak-server-spi-private:.
[ERROR] [o.g.i.b.BuildExceptionReporter] Required by:
[ERROR] [o.g.i.b.BuildExceptionReporter] project :lib
[ERROR] [o.g.i.b.BuildExceptionReporter] > Could not find org.keycloak:keycloak-services:.
[ERROR] [o.g.i.b.BuildExceptionReporter] Required by:
[ERROR] [o.g.i.b.BuildExceptionReporter] project :lib
[ERROR] [o.g.i.b.BuildExceptionReporter] > Could not find org.jboss.logging:jboss-logging:.
[ERROR] [o.g.i.b.BuildExceptionReporter] Required by:
[ERROR] [o.g.i.b.BuildExceptionReporter] project :lib
[ERROR] [o.g.i.b.BuildExceptionReporter] > Could not find org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec:.
[ERROR] [o.g.i.b.BuildExceptionReporter] Required by:
[ERROR] [o.g.i.b.BuildExceptionReporter] project :lib
Это почти как если бы мои зависимости искались в каталоге lib
вместо того, чтобы извлекать их из Maven Central? Может ли кто-нибудь заметить, где я ошибаюсь, и помочь мне построить эту штуку, пожалуйста?
Вам нужно вызывать implementation
для каждой библиотеки и каждый раз указывать версию.
dependencies {
def keycloakVersion = '24.0.3'
implementation 'com.google.guava:guava:32.1.1-jre'
implementation "org.keycloak:keycloak-core:$keycloakVersion"
implementation "org.keycloak:keycloak-server-spi:$keycloakVersion"
//...
}
Здесь мы используем некоторые возможности Groovy, а именно определение переменной и интерполяцию строк.
Я никогда не видел таких обозначений. Возможно, для историков.
Нет, я использую его в другом проекте Gradle 8.3 и использую его уже более 8 лет, только не тот, который был указан как java-library
.
Что ж, документация API для версии 1.0 не сильно отличается от документации для версии 8.7 или версии 5.6.4, если уж на то пошло, поэтому я буду скептически относиться к вашему утверждению. Замечу, что если бы вы указывали имена файлов, то что-то подобное было бы возможно внутри вызова files()
.
java-library
не имеет никакого значения, кроме присвоения конфигурации имени «реализация». Однако возможно, что другой плагин может добавить свою собственную вспомогательную функцию, позволяющую использовать такую запись.
Если вы используете сервер JBoss, вы также можете попробовать ProvideCompile для зависимостей, которые уже существуют в пути к модулю JBoss по умолчанию, например, для средства ведения журнала.
Уф, это было спасибо! То, как я определял зависимости внутри общего блока
implementation
, раньше было законным, было ли оно удалено из Gradle в какой-то момент (очень) недавно?