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
Kotlin JDK 8 java8 jdk14 Gradle 6.4.1
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'
}
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
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
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