blob: cb2c43eee4969263309820a58068eb68fe757fe4 [file] [log] [blame]
Marc Kupietz4f6ed422024-03-01 07:27:46 +01001plugins {
2 // Apply the org.jetbrains.kotlin.jvm Plugin to add support for Kotlin.
Marc Kupietzde917592025-10-31 15:44:27 +01003 id 'org.jetbrains.kotlin.jvm' version '2.2.21'
Marc Kupietz4f6ed422024-03-01 07:27:46 +01004
5 // Apply the application plugin to add support for building a CLI application in Java.
6 id 'application'
Marc Kupietz1b595992024-03-01 14:54:30 +01007 id 'com.github.johnrengelman.shadow' version '8.1.1'
Marc Kupietz4f6ed422024-03-01 07:27:46 +01008}
9
Marc Kupietz4f6ed422024-03-01 07:27:46 +010010repositories {
Marc Kupietz4f6ed422024-03-01 07:27:46 +010011 mavenCentral()
Marc Kupietz56a45562024-03-20 20:18:08 +010012 maven { url 'https://jitpack.io' }
Marc Kupietz4f6ed422024-03-01 07:27:46 +010013}
14
Marc Kupietz47b43c32024-03-27 20:43:32 +010015test {
Marc Kupietzfc18d282025-08-31 12:07:46 +020016 minHeapSize = "512m"
17 maxHeapSize = "4096m"
18 jvmArgs '-XX:MaxMetaspaceSize=1024m'
Marc Kupietz2a3223d2025-11-19 21:05:21 +010019
20 // Enable parallel test execution for faster builds
21 maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
Marc Kupietz47b43c32024-03-27 20:43:32 +010022}
23
Marc Kupietz4f6ed422024-03-01 07:27:46 +010024dependencies {
25 // Align versions of all Kotlin components
26 implementation platform('org.jetbrains.kotlin:kotlin-bom')
27
28 // Use the Kotlin JDK 8 standard library.
29 implementation 'org.jetbrains.kotlin:kotlin-stdlib'
Marc Kupietzfc18d282025-08-31 12:07:46 +020030 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2'
Marc Kupietz4f6ed422024-03-01 07:27:46 +010031
32 // This dependency is used by the application.
Marc Kupietzde917592025-10-31 15:44:27 +010033 implementation 'com.google.guava:guava:33.5.0-jre'
Marc Kupietz4f6ed422024-03-01 07:27:46 +010034
Marc Kupietz31122362024-03-02 11:13:37 +010035
Marc Kupietzfc18d282025-08-31 12:07:46 +020036 implementation ("info.picocli:picocli:4.7.7")
Marc Kupietz31122362024-03-02 11:13:37 +010037
Marc Kupietz4f6ed422024-03-01 07:27:46 +010038 // Use the Kotlin test library.
39 testImplementation 'org.jetbrains.kotlin:kotlin-test'
40
41 // Use the Kotlin JUnit integration.
42 testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
Marc Kupietzde917592025-10-31 15:44:27 +010043 testImplementation "org.jetbrains.kotlin:kotlin-test:2.2.21"
Marc Kupietz0c6e8772024-03-19 07:03:07 +010044
Marc Kupietz1465ce22024-03-26 09:51:17 +010045 implementation 'com.github.kupietz:cistern:v1.0.4'
Marc Kupietzaf682a42024-03-22 06:51:55 +010046 implementation 'org.maltparser:maltparser:1.9.2'
Marc Kupietzde917592025-10-31 15:44:27 +010047 implementation 'org.apache.opennlp:opennlp-tools:2.5.6'
Marc Kupietzddea0c02025-11-15 19:53:38 +010048 implementation 'edu.stanford.nlp:stanford-corenlp:3.9.2'
Marc Kupietzfc18d282025-08-31 12:07:46 +020049 implementation 'org.slf4j:slf4j-simple:2.0.17'
Marc Kupietz916bdfe2024-09-20 09:02:57 +020050 implementation 'org.apache.ant:ant:1.10.15'
Marc Kupietzfc18d282025-08-31 12:07:46 +020051 implementation 'org.apache.commons:commons-compress:1.28.0'
Marc Kupietzd698f0e2025-11-01 20:00:07 +010052 implementation 'me.tongfei:progressbar:0.10.1'
Marc Kupietzd4c6bd52025-11-17 22:18:23 +010053 implementation 'org.lz4:lz4-java:1.8.0'
Marc Kupietza92bacb2024-04-06 20:26:05 +020054
Marc Kupietzd8549e42025-11-16 17:23:04 +010055 // Fix XML APIs conflict - force resolution to the non-relocated version
56 implementation('xml-apis:xml-apis:1.0.b2') {
57 because 'Avoid POM relocation warnings from xml-apis 2.0.2 -> 1.0.b2'
58 }
Marc Kupietz4f6ed422024-03-01 07:27:46 +010059}
60
Marc Kupietz64dce822025-11-02 14:39:39 +010061// Enforce JDK 21 Toolchain and Bytecode-Level 21
Marc Kupietz8d875cc2025-10-31 15:36:33 +010062java {
63 toolchain {
64 languageVersion = JavaLanguageVersion.of(21)
65 }
66}
Marc Kupietz4f6ed422024-03-01 07:27:46 +010067
Marc Kupietz8d875cc2025-10-31 15:36:33 +010068kotlin {
69 jvmToolchain(21)
70}
71
Marc Kupietz64dce822025-11-02 14:39:39 +010072// For any existing Java source code
Marc Kupietz8d875cc2025-10-31 15:36:33 +010073tasks.withType(JavaCompile).configureEach {
74 options.release = 21
75}
76
77tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
78 kotlinOptions {
79 jvmTarget = "21"
Marc Kupietz64dce822025-11-02 14:39:39 +010080 // If available, this ensures consistent API targets similar to Java --release
Marc Kupietz8d875cc2025-10-31 15:36:33 +010081 // freeCompilerArgs += ["-Xjdk-release=21"]
82 }
83}
Marc Kupietz9da19db2024-04-01 11:06:51 +020084
Marc Kupietz64dce822025-11-02 14:39:39 +010085// Explicitly inherit version from root project
Marc Kupietzf13fc7b2025-10-31 17:28:21 +010086version = rootProject.version
87
Marc Kupietz4f6ed422024-03-01 07:27:46 +010088application {
89 // Define the main class for the application.
Marc Kupietz07c60d32025-01-21 19:32:48 +010090 mainClass = 'de.ids_mannheim.korapxmltools.KorapXmlToolKt'
Marc Kupietz4f6ed422024-03-01 07:27:46 +010091}
92
93jar {
Marc Kupietz64dce822025-11-02 14:39:39 +010094 // Mark standard JAR as "plain" to avoid conflicts with ShadowJar
Marc Kupietzf13fc7b2025-10-31 17:28:21 +010095 archiveClassifier.set('plain')
Marc Kupietz4f6ed422024-03-01 07:27:46 +010096 manifest.attributes(
97 'Class-Path': configurations.compileClasspath.collect { it.getName() }.join(' '),
Marc Kupietzde917592025-10-31 15:44:27 +010098 'Main-Class': "de.ids_mannheim.korapxmltools.KorapXmlToolKt",
99 'Implementation-Title': rootProject.name,
100 'Implementation-Version': project.version
Marc Kupietz4f6ed422024-03-01 07:27:46 +0100101 )
Marc Kupietzf13fc7b2025-10-31 17:28:21 +0100102}
103
104shadowJar {
105 archiveBaseName.set('korapxmltool')
106 archiveClassifier.set('')
107 archiveVersion.set(project.version.toString())
108 manifest.attributes(
109 'Main-Class': "de.ids_mannheim.korapxmltools.KorapXmlToolKt",
110 'Implementation-Title': rootProject.name,
111 'Implementation-Version': project.version
112 )
113}
114
Marc Kupietz64dce822025-11-02 14:39:39 +0100115// Ensure that assemble also creates the ShadowJar
Marc Kupietzf13fc7b2025-10-31 17:28:21 +0100116tasks.named('assemble') {
117 dependsOn tasks.named('shadowJar')
118}
119
Marc Kupietz64dce822025-11-02 14:39:39 +0100120// Additionally create a symlink korapxmltool.jar to the current version for stable script paths
121tasks.register('createJarSymlink') {
122 dependsOn shadowJar
123 doLast {
124 def targetJar = shadowJar.archiveFile.get().asFile
125 def linkFile = new File(targetJar.parent, 'korapxmltool.jar')
126
127 // Remove existing symlink or file
128 if (linkFile.exists()) {
129 linkFile.delete()
130 }
131
132 // Create symlink (Java 7+ NIO)
133 try {
134 java.nio.file.Files.createSymbolicLink(
135 linkFile.toPath(),
136 java.nio.file.Paths.get(targetJar.name)
137 )
138 println "Created symlink: ${linkFile.name} -> ${targetJar.name}"
139 } catch (Exception e) {
140 // Fallback to copy on systems where symlinks aren't supported
141 println "Warning: Could not create symlink (${e.message}), copying instead"
142 java.nio.file.Files.copy(targetJar.toPath(), linkFile.toPath())
143 }
144 }
Marc Kupietzf13fc7b2025-10-31 17:28:21 +0100145}
146
Marc Kupietzfbfcd042025-11-16 13:33:32 +0100147// Concatenate shebang + shaded jar into an executable launcher
148tasks.register('assembleShebangExecutable') {
149 dependsOn shadowJar
150 inputs.file(rootProject.file("korapxmltool.shebang"))
Marc Kupietz1869f502025-11-16 21:31:12 +0100151 inputs.file(shadowJar.archiveFile)
152
153 def binDir = rootProject.file("build/bin")
154 def targetExec = new File(binDir, "korapxmltool")
Marc Kupietz481643b2025-11-19 12:27:32 +0100155 def krillExec = new File(binDir, "korapxml2krill")
Marc Kupietzcec41012025-11-19 13:48:48 +0100156 def conlluExec = new File(binDir, "korapxml2conllu")
Marc Kupietza2c33982025-11-19 18:19:46 +0100157 def conllu2korapxmlExec = new File(binDir, "conllu2korapxml")
Marc Kupietz1869f502025-11-16 21:31:12 +0100158 outputs.file(targetExec)
Marc Kupietz481643b2025-11-19 12:27:32 +0100159 outputs.file(krillExec)
Marc Kupietzcec41012025-11-19 13:48:48 +0100160 outputs.file(conlluExec)
Marc Kupietza2c33982025-11-19 18:19:46 +0100161 outputs.file(conllu2korapxmlExec)
Marc Kupietzfbfcd042025-11-16 13:33:32 +0100162
163 doLast {
164 def shebang = rootProject.file("korapxmltool.shebang")
165 if (!shebang.exists()) {
166 throw new GradleException("Missing shebang stub: ${shebang}")
167 }
168
Marc Kupietz1869f502025-11-16 21:31:12 +0100169 // Ensure bin directory exists
170 binDir.mkdirs()
171
Marc Kupietzfbfcd042025-11-16 13:33:32 +0100172 def targetJar = shadowJar.archiveFile.get().asFile
Marc Kupietzfbfcd042025-11-16 13:33:32 +0100173
Marc Kupietz481643b2025-11-19 12:27:32 +0100174 // Create main korapxmltool executable
Marc Kupietzfbfcd042025-11-16 13:33:32 +0100175 targetExec.withOutputStream { os ->
176 os << shebang.bytes
177 os << targetJar.bytes
178 }
Marc Kupietz05d3bbb2025-11-17 15:17:03 +0100179 targetExec.setExecutable(true, false)
Marc Kupietzfbfcd042025-11-16 13:33:32 +0100180 println "Created executable launcher: ${targetExec}"
Marc Kupietz481643b2025-11-19 12:27:32 +0100181
182 // Create korapxml2krill symlink for backward compatibility
183 if (krillExec.exists()) {
184 krillExec.delete()
185 }
186 try {
187 java.nio.file.Files.createSymbolicLink(
188 krillExec.toPath(),
189 java.nio.file.Paths.get("korapxmltool")
190 )
191 println "Created symlink: korapxml2krill -> korapxmltool"
192 } catch (Exception e) {
193 println "Warning: Could not create korapxml2krill symlink (${e.message}), copying instead"
194 java.nio.file.Files.copy(targetExec.toPath(), krillExec.toPath())
195 krillExec.setExecutable(true, false)
196 }
Marc Kupietzcec41012025-11-19 13:48:48 +0100197
198 // Create korapxml2conllu symlink for backward compatibility
199 if (conlluExec.exists()) {
200 conlluExec.delete()
201 }
202 try {
203 java.nio.file.Files.createSymbolicLink(
204 conlluExec.toPath(),
205 java.nio.file.Paths.get("korapxmltool")
206 )
207 println "Created symlink: korapxml2conllu -> korapxmltool"
208 } catch (Exception e) {
209 println "Warning: Could not create korapxml2conllu symlink (${e.message}), copying instead"
210 java.nio.file.Files.copy(targetExec.toPath(), conlluExec.toPath())
211 conlluExec.setExecutable(true, false)
212 }
Marc Kupietza2c33982025-11-19 18:19:46 +0100213
214 // Create conllu2korapxml symlink for CoNLL-U to KorAP XML ZIP conversion
215 if (conllu2korapxmlExec.exists()) {
216 conllu2korapxmlExec.delete()
217 }
218 try {
219 java.nio.file.Files.createSymbolicLink(
220 conllu2korapxmlExec.toPath(),
221 java.nio.file.Paths.get("korapxmltool")
222 )
223 println "Created symlink: conllu2korapxml -> korapxmltool"
224 } catch (Exception e) {
225 println "Warning: Could not create conllu2korapxml symlink (${e.message}), copying instead"
226 java.nio.file.Files.copy(targetExec.toPath(), conllu2korapxmlExec.toPath())
227 conllu2korapxmlExec.setExecutable(true, false)
228 }
Marc Kupietzfbfcd042025-11-16 13:33:32 +0100229 }
230}
231
Marc Kupietz1869f502025-11-16 21:31:12 +0100232tasks.named('assemble') {
233 dependsOn createJarSymlink
234 dependsOn assembleShebangExecutable
235}
236
Marc Kupietzf13fc7b2025-10-31 17:28:21 +0100237tasks.named('build') {
Marc Kupietz64dce822025-11-02 14:39:39 +0100238 dependsOn createJarSymlink
Marc Kupietzfbfcd042025-11-16 13:33:32 +0100239 dependsOn assembleShebangExecutable
Marc Kupietz4f6ed422024-03-01 07:27:46 +0100240}
241
242
243configurations {
244 runtimeLib.extendsFrom implementation
245}