Erstellen Sie mit Gradle ein Java-Multiprojekt

So machen Sie ein Multiprojekt mit Gradle.

Erstellen Sie eine JAR-Datei in einem einzelnen Projekt

Erstellen Sie vor der Multiprojektion zunächst eine JAR-Datei und führen Sie sie in einem einzelnen Projekt aus.

Gradle-Projekterstellung

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 Datei build.gradle

Ä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"
    }
}

Quellenerstellung

Erstellen Sie eine auszuführende Quelle.

src/main/java/App.java


public class App {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

Versuchen Sie zu bauen und auszuführen.

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.

Erstellen eines Multiprojekts

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

Fixing settings.gralde

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.

Browser.png

Fix build.gradle

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


Code

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!";
    }
}

bauen und laufen

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!

Referenz

Gradle-Benutzerhandbuch-> Multi-Projekt erstellen

Recommended Posts

Erstellen Sie mit Gradle ein Java-Multiprojekt
Erstellen eines Java-Projekts mit Gradle
Multiprojekt mit Keycloak
[Java] Erstellen Sie mit Gradle ein ausführbares Modul
CICS-Java-Anwendung ausführen- (3) Build-Management mit Gradle
Erstellung von Java-Dateien
Konfigurieren Sie ein Multiprojekt mit Unterverzeichnissen in Gradle
Einführung eines automatisierten Java-Tests mit JUnit 5 + Gradle
Erstellung eines Java-Verzeichnisses
Machen Sie die SpringBoot1.5 + Gradle4.4 + Java8 + Docker-Umgebung mit Java11 kompatibel
Führen Sie eine statische Code-Analyse mit Checkstyle mit Java + Gradle durch
Erstellen und testen Sie Java + Gradle-Anwendungen mit Wercker
Erstellen Sie mit Gradle mit VSCode Java → Ausführen
Ich wollte Spring Boot in einem Multiprojekt gradle
[Jakarta EE 8 Anwendungsentwicklung mit Gradle] 2. Projekterstellung
Installieren Sie Java mit Homebrew
Verwenden Sie ProGuard mit Gradle
Integrationstest mit Gradle
Eclipse ~ Java-Projekterstellung ~
Wechseln Sie die Plätze mit Java
Installieren Sie Java mit Ansible
Bequemer Download mit JAVA
Erster Gradle Build (Java)
Installieren Sie Gradle auf ubuntu16.04
Erstellen Sie Diagramme mit JFreeChart
Schalten Sie Java mit direnv
Datenkern beginnend mit Gradle
Java-Download mit Ansible
Lass uns mit Java kratzen! !!
Verwenden Sie WebJars mit Gradle
Erstellen Sie Java mit Wercker
Beginnen Sie mit Gradle
Verwenden Sie jlink mit gradle
Java Discord Bot-Erstellung
[Java] Taschenrechnerprogramm erstellen 1
Endian-Konvertierung mit JAVA
Überprüfen Sie die Abdeckung mit Codecov in der Java + Gradle + Wercker-Konfiguration
(Java) Einfache BDD mit Spektrum?
Verwenden Sie Lambda-Ebenen mit Java
Erste Schritte mit Java Collection
Gradle + Kotlin-Glas mit DSL generieren
Java-Konfiguration mit Spring MVC
Grundlegende Authentifizierung mit Java 11 HttpClient
Experimentieren wir mit der Java-Inline-Erweiterung
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
[Vorlage] MySQL-Verbindung mit Java
Schreiben Sie Java Try-Catch mit Optional neu
Installieren Sie Java 7 mit Homebrew (Fass)
[Java] JSON-Kommunikation mit Jackson
Java zum Spielen mit Function
Versuchen Sie eine DB-Verbindung mit Java
Spring + Gradle + Java Schnellstart
[Gradle] Informationen zu Java-Plug-In-Aufgaben
Aktivieren Sie Java EE mit NetBeans 9
[Java] Erstellen von Originalanmerkungen
[Java] JavaConfig mit statischer innerer Klasse
Versuchen Sie gRPC mit Java, Maven
Lassen Sie uns Excel mit Java betreiben! !!
Java-Versionsverwaltung mit SDKMAN
Spring Boot 2 Multiprojekt mit Gradle