So machen Sie ein Multiprojekt mit Gradle.
Erstellen Sie vor der Multiprojektion zunächst eine JAR-Datei und führen Sie sie in einem einzelnen Projekt aus.
Gradle-Initialisierung
$ gradle init
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 1
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 1
Project name (default: JavaMultiProject):
> Task :init
Get more help with your project: https://guides.gradle.org/creating-new-gradle-builds
BUILD SUCCESSFUL in 6s
2 actionable tasks: 2 executed
Ändern Sie die automatisch erstellte Datei build.gradle ein wenig. Das Wichtigste ist, eine Glasaufgabe zu erstellen.
build.gradle
apply plugin: 'java'
apply plugin: 'application'
sourceCompatibility = 11
targetCompatibility = 11
repositories {
jcenter()
}
dependencies {
}
mainClassName = 'App'
jar {
manifest {
attributes 'Main-Class': "App"
}
}
Erstellen Sie eine auszuführende Quelle.
src/main/java/App.java
public class App {
public static void main(String[] args) {
System.out.println("Hello");
}
}
bauen und laufen
$ gradle build
BUILD SUCCESSFUL in 2s
5 actionable tasks: 1 executed, 4 up-to-date
$ java -jar build/libs/JavaMultiProject.jar
Hello
Sie haben die JAR-Datei erfolgreich in einem einzigen Projekt erstellt und ausgeführt.
Jetzt erstellen wir ein Multiprojekt.
Dies ist die Verzeichnisstruktur.
Verfassung
.(JavaMultiProject)
├── bar (Anwendungsprojekt)
│ ├── src
│ ├── build.gradle
├── foo (Anwendungsprojekt)
│ ├── src
│ ├── build.gradle
├── share (Projekt, das als gemeinsame Bibliothek verwendet werden soll)
│ ├── src
│ ├── build.gradle
├── build.gradle
├── setting.gradle
Erstellen Sie ein Verzeichnis.
python
$ mkdir -p bar/src/main/java
$ mkdir -p foo/src/main/java
$ mkdir -p share/src/main/java
Für mehrere Projekte setzen Sie in settings.gradle.
Geben Sie in include ein Teilprojekt an.
setting.gradle
rootProject.name = 'JavaMultiProject'
include 'foo', 'bar', 'share'
Dadurch wird jedes for`` bar`` share
-Verzeichnis als Teilprojekt erkannt.
IntelliJ IDEA erkennt das Projekt auch auf diese Weise.
![]() |
---|
Geben Sie in build.gradle, das im Projektstamm vorhanden ist, die Einstellungen an, die für alle Teilprojekte gelten, indem Sie Teilprojekte angeben.
build.gradle(root)
allprojects {
}
subprojects {
apply plugin: 'java'
sourceCompatibility = 11
targetCompatibility = 11
repositories {
jcenter()
}
}
Als nächstes folgt das Teilprojekt build.gradle.
Beginnen wir mit dem Anwendungsprojekt bar
.
bar/build.gradle
apply plugin: 'application'
dependencies {
implementation project(":share")
}
mainClassName = 'com.example.Bar'
jar {
manifest {
attributes 'Main-Class': "com.example.Bar"
}
from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
Um den wichtigen Teil zu erklären, Das Implementierungsprojekt (": share") in Abhängigkeiten definiert, dass es von einem anderen Teilprojekt, share, abhängt.
Ich gebe auch "from ~" in der JAR-Aufgabe an, was bedeutet, dass die abhängigen Bibliotheken im JAR des Bar-Projekts enthalten sind.
Wenn die from-Methode nicht vorhanden ist, enthält das jar übrigens keine abhängigen Bibliotheken, sodass ein Fehler "NoClassDefFoundError" ausgegeben wird. Nur für den Fall, dass ich damit nicht weiterkomme.
python
$ java -jar bar/build/libs/bar.jar
Exception in thread "main" java.lang.NoClassDefFoundError: com/example/Hello
at com.example.Bar.main(Bar.java:5)
Caused by: java.lang.ClassNotFoundException: com.example.Hello
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more
Das foo-Projekt ist fast das gleiche wie das Bar-Projekt, aber ich werde es nur für den Fall beschreiben. Nur mainClassName wird in Foo geändert.
foo/build.gradle
apply plugin: 'application'
dependencies {
implementation project(":share")
}
mainClassName = 'com.example.Foo'
jar {
manifest {
attributes 'Main-Class': "com.example.Foo"
}
from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
Das build.gradle von share erwähnt diesmal nichts.
share/build.gradle
Zum Schluss werde ich den Code schreiben.
bar/src/main/java/com/exmaple/Bar.java
package com.example;
public class Bar {
public static void main(String[] args) {
var hello = new Hello("Bar");
System.out.println(hello.say());
}
}
foo/src/main/java/com/exmaple/Foo.java
package com.example;
public class Foo {
public static void main(String[] args) {
var hello = new Hello("Foo");
System.out.println(hello.say());
}
}
share/src/main/java/com/exmaple/Hello.java
package com.example;
public class Hello {
private final String name;
public Hello(String name) {
this.name = name;
}
public String say() {
return name + " Hello!";
}
}
Ich werde versuchen zu bauen.
Teilprojektaufgaben werden mit : (Projektname): (Aufgabenname)
ausgeführt.
Außerdem wird gleichzeitig der Build des Freigabeprojekts ausgeführt, von dem der Balken abhängt.
python
$ gradle :bar:build
BUILD SUCCESSFUL in 804ms
7 actionable tasks: 7 up-to-date
$ ls -l bar/build/libs/
total 8
-rw-r--r-- 1 ysaito staff 1591 4 29 21:15 bar.jar
Wenn Sie das erstellte JAR als Referenz entpacken, sehen Sie, dass Hello.class in der Freigabe in der erstellten bar.jar enthalten ist.
Öffnen Sie das Glas und überprüfen Sie
$ jar xvf bar.jar
META-INF/Wurde erstellt
META-INF/MANIFEST.MF wurde eingesetzt
com/Wurde erstellt
com/example/Wurde erstellt
com/example/Bar.Klasse wurde erweitert
com/example/Hello.Klasse wurde erweitert
Jetzt, wo wir ein Glas haben, lassen wir es laufen.
python
$ java -jar bar/build/libs/bar.jar
Bar Hello!
$ java -jar foo/build/libs/foo.jar
Foo Hello!
Gradle-Benutzerhandbuch-> Multi-Projekt erstellen
Recommended Posts