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