Studiennotizen zu "Kompilieren", "API" und "Implementierung", angegeben durch "Abhängigkeiten" in Gradle.
Java Library Plugin wurde in Gradle 3.4 (https://docs.gradle.org/3.4/release-notes) hinzugefügt. (html # the-java-library-plugin) scheint die Verwendung von "compile" mit "dependencies" veraltet zu sein (auch "runtime", "testCompile", "testRuntime").
In 4.7 Beschreibung des Java-Plugins wird es als "Veraltet" geschrieben. (4.6 Dokumentation sagt nicht "Veraltet", aber es ist definitiv veraltet Vor kurzem?)
Es wird empfohlen, stattdessen "Implementierung" und "API" zu verwenden.
Implementierung
Projektstruktur
|-settings.gradle
|-build.gradle
|
|-foo/
| |-build.gradle
| `-src/main/java/foo/
| `-Foo.java
|
`-bar/
|-build.gradle
`-src/main/java/bar/
`-Bar.java
/settings.gradle
include 'foo', 'bar'
/build.gradle
subprojects {
apply plugin: 'java'
sourceCompatibility = 10
targetCompatibility = 10
compileJava.options.encoding = 'UTF-8'
repositories {
mavenCentral()
}
}
/bar/build.gradle
dependencies {
compile 'org.apache.commons:commons-lang3:3.7'
}
Bar.java
package bar;
import org.apache.commons.lang3.RandomStringUtils;
public class Bar {
public void hello() {
System.out.println("Bar: " + RandomStringUtils.random(10, "0123456789"));
}
}
/foo/build.gradle
apply plugin: 'application'
mainClassName = 'foo.Foo'
dependencies {
compile project(':bar')
}
Foo.java
package foo;
import bar.Bar;
import org.apache.commons.lang3.RandomStringUtils;
public class Foo {
public static void main(String... args) {
new Bar().hello();
System.out.println("Foo: " + RandomStringUtils.random(10, "0123456789"));
}
}
bar
hängt von commons-lang3
ab
--foo
hängt vom bar
Projekt abcommons-lang3
** Ausführungsergebnis **
> gradle :foo:run
Bar: 3803159716
Foo: 6423224304
Implementierung
/bar/build.gradle
dependencies {
implementation 'org.apache.commons:commons-lang3:3.7'
}
/foo/build.gradle
apply plugin: 'application'
mainClassName = 'foo.Foo'
dependencies {
implementation project(':bar')
}
** Ausführungsergebnis **
> gradle :foo:run
...\foo\src\main\java\foo\Foo.java:4:Error:Paket org.apache.commons.lang3 existiert nicht
import org.apache.commons.lang3.RandomStringUtils;
^
...\foo\src\main\java\foo\Foo.java:10:Error:Symbol kann nicht gefunden werden
System.out.println("Foo: " + RandomStringUtils.random(10, "0123456789"));
^
Symbol:Variable RandomStringUtils
Ort:Klasse Foo
2 Fehler
...
Abhängigkeitsbeziehung
# compile
[foo] --compile--> [bar] --compile--> [commons-lang3]
[foo] - ok -> [bar] - ok -> [commons-lang3]
| ^
| |
+------------ ok ---------------+
# implementation
[foo] --implementation--> [bar] --implementation--> [commons-lang3]
[foo] - ok -> [bar] - ok -> [commons-lang3]
| x
| |
+------------ ng ---------------+
compile
angegebenen Abhängigkeiten werden weitergegebenfoo
Projekt kann commons-lang3
nicht verwenden)Implementierung
/bar/build.gradle
apply plugin: 'java-library'
dependencies {
api 'org.apache.commons:commons-lang3:3.7'
}
** Ausführungsergebnis **
$ gradle :foo:run
Bar: 7783742303
Foo: 6741510207
/bar/build.gradle
apply plugin: 'java-library'
dependencies {
api 'org.apache.commons:commons-lang3:3.7'
}
api
wird durch Hinzufügen des Java Library Plugins verfügbar
--Um das Java Library Plugin zu verwenden, fügen Sie das Plugin mit java-library
hinzuIn der offiziellen Dokumentation wird erläutert, dass die Verwendung von "Implementierung" anstelle von "Kompilieren" die folgenden Vorteile bietet:
Kurz gesagt, die Verwendung von "Kompilieren" hatte die folgenden Probleme.
――Da alle Abhängigkeiten vorübergehend weitergegeben werden, haben sich die Abhängigkeiten unnötig erweitert.
Durch die Definition mit "Implementierung" ist es möglich, eine unnötige Erweiterung von Abhängigkeiten zu verhindern und nur die Abhängigkeiten zu überführen, die mit "API" wirklich notwendig sind.
Es hat auch den Vorteil, dass die Häufigkeit von Neukompilierungen reduziert werden kann, indem verhindert wird, dass "Implementierung" Abhängigkeiten verbreitet.
Das Folgende ist meine persönliche Meinung.
configuration |
Abhängigkeitsausbreitung | Definiertes Plug-In |
---|---|---|
compile |
Machen | Java Plugin |
implementation |
TU es nicht | Java Plugin |
api |
Machen | Java Library Plugin |