[PYTHON] Créez Fatjar en changeant la classe principale avec Gradle

Objectif

Il y avait une bibliothèque qui ne pouvait être utilisée qu'en Java, et il y avait une application existante qui l'implémentait dans Kotlin. Cette fois, je voulais appeler certaines des fonctionnalités d'un lot Python et les utiliser, donc Changer la classe principale de l'application Kotlin pour créer un fichier jar Je voulais frapper Kotlin avec une commande java de Python.

Il semble que si vous utilisez bien Gradle, vous pouvez changer la classe principale et créer Fatjar. Je vais défier

environnement

Kotlin JDK 8 java8 jdk14 Gradle 6.4.1

Construction

J'ai essayé de créer un projet simple à essayer

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("Thon", 100)
    println("J'ai choisi ceci.: " + 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("J'ai choisi ceci.: " + 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'
}

Créer un fichier jar avec la classe principale telle quelle

Vous pouvez créer le projet avec la commande suivante

$ ./gradlew shadowJar
# or
$ gradle shadowJar

Dans ce cas, le fichier AppKt est spécifié dans mainClassName dans le fichier app / build.gradle. App.kt s'exécute en tant que classe principale.

Commande pour exécuter le jar construit

$ java -jar xxx-1.0-SNAPSHOT-all.jar
Hello world.
J'ai choisi ceci.:Thon-> ¥100

Construire en changeant la classe principale en une autre classe

Ajoutez la tâche de construction au fichier gradle.build.

app/build.gradle


:
application {
    // Define the main class for the application.
    mainClassName = 'automated_data_create.AppKt'
}
#Ajouter ci-dessous à partir d'ici ↓
task customFatJar2(type:Jar) {
    //Paramètres de la classe principale
    manifest {
        attributes 'Main-Class': 'automated_data_create.App2Kt'
    }
    baseName = 'second'
    //Ajouter des bibliothèques dépendantes
    from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }


    with jar
}

Ici, la classe principale est spécifiée comme App2.Kt. Spécifiez un nom de fichier jar pour baseName.

Notez que la méthode d'ajout de bibliothèques dépendantes dépend de la version de gradle.

Récupérez le jeu de compilation dans compile: dependencies sous forme de liste.

compileClasspath: Récupère les dépendances enregistrées dans l'implémentation, etc. dans une liste.

Référence: Comment utiliser correctement la compilation et l'implémentation     https://qiita.com/opengl-8080/items/6ad642e0b016465891de Il était facile de voir à quoi ressemblaient cofigrations.compile et configurations.compileClasspath     https://qiita.com/MirrgieRiana/items/d3271f6979c1451207a6

--Exécuter la tâche gradle

$ ./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

--Exécuter un pot

$ java -jar build/libs/second.jar
Hello world.
J'ai choisi ceci.:Uni-> ¥200

À la fin

Maintenant que vous pouvez accéder à l'application de Kotlin avec la commande java, Il ne nous reste plus qu'à l'exécuter depuis Python! Au fait, je prévois de l'exécuter à partir de Python en utilisant la bibliothèque de sous-processus. S'il vous plaît laissez-moi savoir s'il existe une meilleure façon!

Recommended Posts

Créez Fatjar en changeant la classe principale avec Gradle
Changer le mouvement en changeant la liste déroulante avec tkinter
Rendre la console Python couverte d'UNKO
Installer en spécifiant la version avec pip
Rendre la bibliothèque créée par Eigen of C ++ disponible à partir de Python avec Boost.Numpy.
Recréez l'écran d'inscription du personnel de Django avec la classe
Élevez la dimension avec np.newaxis et opération de diffusion
Enregistrez la sortie du GAN conditionnel pour chaque classe ~ Avec l'implémentation cGAN par PyTorch ~