# Gradle: Externe Abhängigkeiten einschließen?



## temi (28. Jun 2020)

Hallo zusammen,

ich blicke (wieder einmal) bei Gradle nicht durch. Ich möchte eine kleine Java-Library erstellen. Diese nutzt logback als Dependency. Diese Bibliothek möchte ich in ein lokales Verzeichnis exportieren, damit ich sie in einem anderen Java-Projekt wieder mittels Gradle einbinden kann. Das funktioniert im Prinzip auch, aber offenbar wird die Abhängigkeit zu logback nicht mit exportiert, denn mein Testprojekt, dass die Bibliothek verwenden soll, meldet den Fehler, dass slf4j nicht gefunden wird.

Ich dachte das so etwas über die Angaben unter "dependencies" gesteuert wird, hier also "implementation" und "testImplementation". Anscheinend reicht das aber nicht aus. Ich habe jetzt gelesen, das es noch die Angabe "api" gibt, aber das dient wohl dazu die Abhängigkeit dem Nutzer der Bibliothek ebenfalls zu veröffentlichen. Ich möchte sie (hier) aber nur innerhalb der Bibliothek nutzen.

Kann mir da mal jemand helfend unter die Arme greifen?


```
plugins {
    id 'java-library'
}

group 'de.xxx'
version '0.1'

repositories {
    mavenCentral()
}

dependencies {
    implementation "ch.qos.logback:logback-classic:1.2.3"
    testImplementation "org.junit.platform:junit-platform-runner:1.6.2"
    testImplementation "org.junit.jupiter:junit-jupiter-engine:5.6.2"
    testImplementation "org.junit.vintage:junit-vintage-engine:5.6.2"
}

test {
    useJUnitPlatform()
}

uploadArchives {
    repositories {
        flatDir {
            dirs "/.../.gradle/artifacts/"
        }
    }
}
```


----------



## looparda (29. Jun 2020)

Ich fürchte du musst über ein lokales Repository gehen, damit das mit den Abhängigkeiten klappt. Jedenfalls konnte ich es so hinfrickeln, dass es funktioniert. Kommt das für dich infrage?

producer

```
plugins {
    id 'java-library'
    id 'maven'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

group 'de.xxx'
version '0.1'


repositories {
    mavenCentral()
    maven { url "${rootProject.file("/.gradle/repo/").toURL()}" }
}

dependencies {
    compile ('org.slf4j:slf4j-api:1.7.30')
    implementation ("ch.qos.logback:logback-classic:1.2.3")
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: rootProject.file(".gradle/repo/").toURL() )
        }
    }
}
```
consumer

```
plugins {
    id 'java'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

group 'de.xxx'
version '0.1'


repositories {
    mavenCentral()
    maven { url "${rootProject.file("/.gradle/repo/").toURL()}" }
}

dependencies {
    implementation 'de.xxx:producer:0.1'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
```


----------



## temi (30. Jun 2020)

Vielen Dank an @looparda für die Anregung mit dem lokalen Maven Repository. Ich habe es jetzt so gemacht:

```
plugins {
    id 'java-library'
    id 'maven-publish'
}

group 'de.xxx'
version '0.1'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'ch.qos.logback:logback-classic:1.2.3'
    testImplementation 'org.junit.platform:junit-platform-runner:1.6.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
    testImplementation 'org.junit.vintage:junit-vintage-engine:5.6.2'
}

test {
    useJUnitPlatform()
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}
```

Der passenden Gradle-Task ist dann *publishToMavenLocal*

Im Consumer reicht dann:

```
repositories {
    mavenCentral()
    mavenLocal()
}
```


Damit komme ich zurecht. Notfalls kann man den Ort von MavenLocal ja noch anpassen.


----------



## looparda (30. Jun 2020)

Oops, ja das ist der Task, den ich auch benutzt habe - hatte ich vergessen dazuzuschreiben. Klar kannst du auch das lokale Maven Repo nehmen, das vereinfacht das ganze. Ich dachte nur du willst es eben nicht benutzen sondern ein temporäres erstellen - deshalb die Tricksereien mit den Pfaden.


----------



## temi (1. Jul 2020)

looparda hat gesagt.:


> Oops, ja das ist der Task, den ich auch benutzt habe - hatte ich vergessen dazuzuschreiben. Klar kannst du auch das lokale Maven Repo nehmen, das vereinfacht das ganze. Ich dachte nur du willst es eben nicht benutzen sondern ein temporäres erstellen - deshalb die Tricksereien mit den Pfaden.


Ich habe es inzwischen auch noch mal geändert. So schaut es jetzt (ausschnittsweise) aus:

```
publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }

    repositories {
        maven {
            url 'file://home/.../Java/.m2/'
        }
    }
}
```
Das funktioniert dann mit dem Task "publish".


----------

