[PYTHON] Mache Fatjar, indem du die Hauptklasse mit Gradle wechselst

Zweck

Es gab eine Bibliothek, die nur in Java verwendet werden konnte, und es gab eine vorhandene Anwendung, die sie in Kotlin implementierte. Dieses Mal wollte ich einige der Funktionen aus einem Python-Stapel aufrufen und sie verwenden Ändern Sie die Hauptklasse der Kotlin-Anwendung, um ein Glas zu erstellen Ich wollte Kotlin mit einem Java-Befehl von Python treffen.

Es scheint, dass Sie, wenn Sie Gradle gut verwenden, die Hauptklasse ändern und Fatjar machen können. Ich werde herausfordern

Umgebung

Kotlin JDK 8 java8 jdk14 Gradle 6.4.1

Konstruktion

Ich habe versucht, ein einfaches Projekt zu erstellen, um es zu versuchen

app
├── gradle
│   └── wrapper
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
├── build.gradle
└── src
    ├── main
    │   ├── kotlin
    │   │   └── automated_data_create
    │   │       ├── App.kt
    │   │       ├── App2.kt
    │   │       └── model
    │   │           └── Osushi.kt
    │   └── resources
    └── test
        ├── kotlin
        │   └── automated_data_create
        │       └── AppTest.kt
        └── resources

app/src/main/kotlin/automated_data_create/App.kt


/*
 * This Kotlin source file was generated by the Gradle 'init' task.
 */
package automated_data_create

import automated_data_create.model.Osushi

class App {
    val greeting: String
        get() {
            return "Hello world."
        }

}

fun main(args: Array<String>) {
    println(App().greeting)
    val osushi = Osushi("Thunfisch", 100)
    println("Ich habe das ausgewählt.: " + osushi.name + " -> " + "¥" + osushi.price)
}

app/src/main/kotlin/automated_data_create/App2.kt


/*
 * This Kotlin source file was generated by the Gradle 'init' task.
 */
package automated_data_create

import automated_data_create.model.Osushi


class App2 {
    val greeting: String
        get() {
            return "Hello world."
        }

}

fun main(args: Array<String>) {
    println(App2().greeting)
    val osushi = Osushi("Uni", 200)
    println("Ich habe das ausgewählt.: " + osushi.name + " -> " + "¥" + osushi.price)
}

app/build.gradle


/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Kotlin application project to get you started.
 */

plugins {
    // Apply the Kotlin JVM plugin to add support for Kotlin.
    id 'org.jetbrains.kotlin.jvm' version '1.3.61'

    // Apply the application plugin to add support for building a CLI application.
    id 'application'
    id 'com.github.johnrengelman.shadow' version '5.0.0'
    id 'java'
}

repositories {
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
    // Align versions of all Kotlin components
    implementation platform('org.jetbrains.kotlin:kotlin-bom')

    // Use the Kotlin JDK 8 standard library.
    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'

    // Use the Kotlin test library.
    testImplementation 'org.jetbrains.kotlin:kotlin-test'

    // Use the Kotlin JUnit integration.
    testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
}

application {
    // Define the main class for the application.
    mainClassName = 'automated_data_create.AppKt'
}

Erstellen einer JAR-Datei mit der Hauptklasse wie sie ist

Sie können das Projekt mit dem folgenden Befehl erstellen

$ ./gradlew shadowJar
# or
$ gradle shadowJar

In diesem Fall wird die AppKt-Datei in mainClassName in der Datei app / build.gradle angegeben. App.kt wird als Hauptklasse ausgeführt.

Befehl zum Ausführen des erstellten JAR

$ java -jar xxx-1.0-SNAPSHOT-all.jar
Hello world.
Ich habe das ausgewählt.:Thunfisch-> ¥100

Erstellen Sie, indem Sie die Hauptklasse in eine andere Klasse ändern

Fügen Sie die Build-Aufgabe zur Datei gradle.build hinzu.

app/build.gradle


:
application {
    // Define the main class for the application.
    mainClassName = 'automated_data_create.AppKt'
}
#Fügen Sie unten von hier hinzu ↓
task customFatJar2(type:Jar) {
    //Hauptklasseneinstellungen
    manifest {
        attributes 'Main-Class': 'automated_data_create.App2Kt'
    }
    baseName = 'second'
    //Fügen Sie abhängige Bibliotheken hinzu
    from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }


    with jar
}

Hier wird die Hauptklasse als App2.Kt angegeben. Geben Sie einen beliebigen JAR-Dateinamen für baseName an.

Beachten Sie, dass das Hinzufügen abhängiger Bibliotheken von der Version von gradle abhängt.

Holen Sie sich das Kompilierungsset in compile: Abhängigkeiten als Liste.

compileClasspath: Ruft die in der Implementierung usw. registrierten Abhängigkeiten in einer Liste ab.

Referenz: So verwenden Sie Kompilieren und Implementieren ordnungsgemäß     https://qiita.com/opengl-8080/items/6ad642e0b016465891de Es war leicht zu erkennen, wie cofigrations.compile und configuration.compileClasspath aussah     https://qiita.com/MirrgieRiana/items/d3271f6979c1451207a6

$ ./gradlew customFatJar2
or
$ gradle customFatJar2

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.4.1/userguide/command_line_interface.html#sec:command_line_warnings


BUILD SUCCESSFUL in 1s
$ java -jar build/libs/second.jar
Hello world.
Ich habe das ausgewählt.:Uni-> ¥200

Am Ende

Jetzt, da Sie Kotlins Anwendung mit dem Java-Befehl aufrufen können, Jetzt müssen wir es nur noch von Python aus ausführen! Übrigens habe ich vor, es mit der Unterprozessbibliothek von Python aus auszuführen. Bitte lassen Sie mich wissen, ob es einen besseren Weg gibt!

Recommended Posts

Mache Fatjar, indem du die Hauptklasse mit Gradle wechselst
Ändern Sie die Bewegung, indem Sie das Kombinationsfeld mit tkinter ändern
Machen Sie die Python-Konsole mit UNKO bedeckt
Installieren Sie, indem Sie die Version mit pip angeben
Stellen Sie die von Eigen of C ++ erstellte Bibliothek mit Boost.Numpy in Python zur Verfügung.
Erstellen Sie den Registrierungsbildschirm für Django-Mitarbeiter mit Klasse neu
Erhöhen Sie die Dimension mit np.newaxis und Broadcast-Betrieb
Speichern Sie die Ausgabe der bedingten GAN für jede Klasse ~ Mit der cGAN-Implementierung von PyTorch ~