There was a library that could only be used in Java, and there was an existing application that implemented it in Kotlin. This time I wanted to call some of the features from a Python batch and use them, so Change the main class of Kotlin application to make a jar, I wanted to hit Kotlin with a java command from Python.
It seems that if you use Gradle well, you can change the main class and make Fatjar. I will challenge
Kotlin JDK 8 java8 jdk14 Gradle 6.4.1
I tried to create a simple project to try
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("Tuna", 100)
println("I have selected this.: " + 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("Sea urchin", 200)
println("I have selected this.: " + 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'
}
You can build the project with the following command
$ ./gradlew shadowJar
# or
$ gradle shadowJar
In this case, since the AppKt file is specified in mainClassName in the app / build.gradle file, App.kt runs as the main class.
Command to execute the built jar
$ java -jar xxx-1.0-SNAPSHOT-all.jar
Hello world.
I have selected this.:Tuna-> ¥100
Add the build task to your gradle.build file.
app/build.gradle
:
application {
// Define the main class for the application.
mainClassName = 'automated_data_create.AppKt'
}
#Add below from here ↓
task customFatJar2(type:Jar) {
//Main class settings
manifest {
attributes 'Main-Class': 'automated_data_create.App2Kt'
}
baseName = 'second'
//Add dependent libraries
from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
Here, the main class is specified as App2.Kt. Specify any jar file name for baseName.
Note that how to add dependent libraries depends on the version of gradle.
compile
: Get the compile set in dependencies as a list.
compileClasspath
: Get the dependencies registered in implementation etc. in a list.
Reference: How to use compile and implementation properly https://qiita.com/opengl-8080/items/6ad642e0b016465891de It was easy to see what cofigrations.compile and configurations.compileClasspath looked like https://qiita.com/MirrgieRiana/items/d3271f6979c1451207a6
--Execute gradle task
$ ./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
--Jar execution
$ java -jar build/libs/second.jar
Hello world.
I have selected this.:Sea urchin-> ¥200
Now that you can hit Kotlin applications with java commands, All we have to do now is run it from Python! By the way, from Python I plan to run it using the subprocess library. Please let me know if there is a better way!
Recommended Posts