From 9c8afeb0f0deba836681f816d58899b6b309dacd Mon Sep 17 00:00:00 2001 From: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> Date: Fri, 17 May 2024 16:55:20 +0200 Subject: [PATCH 1/7] initial --- build.gradle | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 5095d6e76b4..9cee4579459 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,8 @@ plugins { id 'idea' id 'org.openrewrite.rewrite' version '6.12.0' + + id 'org.graalvm.buildtools.native' version '0.10.1' } // Enable following for debugging @@ -42,8 +44,8 @@ group = "org.jabref" version = project.findProperty('projVersion') ?: '100.0.0' java { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + sourceCompatibility = JavaVersion.VERSION_22 + targetCompatibility = JavaVersion.VERSION_22 // Workaround needed for Eclipse, probably because of https://github.com/gradle/gradle/issues/16922 // Should be removed as soon as Gradle 7.0.1 is released ( https://github.com/gradle/gradle/issues/16922#issuecomment-828217060 ) modularity.inferModulePath.set(false) @@ -53,7 +55,7 @@ java { // - .gitpod.Dockerfile // - .devcontainer/devcontainer.json#L34 and // - .github/workflows/deployment-jdk-ea.yml#L53 - languageVersion = JavaLanguageVersion.of(21) + languageVersion = JavaLanguageVersion.of(22) // See https://docs.gradle.org/current/javadoc/org/gradle/jvm/toolchain/JvmVendorSpec.html for a full list // vendor = JvmVendorSpec.AMAZON } @@ -525,7 +527,7 @@ testlogger { showStackTraces false } -tasks.withType(Test) { +tasks.withType(Test).configureEach { reports.html.outputLocation.set(file("${reporting.baseDir}/${name}")) // Enable parallel tests. See https://docs.gradle.org/8.1/userguide/performance.html#execute_tests_in_parallel for details. maxParallelForks = Runtime.runtime.availableProcessors() - 1 @@ -828,3 +830,10 @@ jmh { iterations = 10 fork = 2 } + +graalvmNative.binaries.configureEach { + javaLauncher.set(javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(22) + vendor = JvmVendorSpec.GRAAL_VM + }) + } From d39fb3563ac285b0a21cf25fd9614a5804ff1052 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sat, 18 May 2024 13:35:32 +0200 Subject: [PATCH 2/7] Go back to Java 21 (and fix indent) --- build.gradle | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 9cee4579459..cfbeebf8ec8 100644 --- a/build.gradle +++ b/build.gradle @@ -44,8 +44,8 @@ group = "org.jabref" version = project.findProperty('projVersion') ?: '100.0.0' java { - sourceCompatibility = JavaVersion.VERSION_22 - targetCompatibility = JavaVersion.VERSION_22 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 // Workaround needed for Eclipse, probably because of https://github.com/gradle/gradle/issues/16922 // Should be removed as soon as Gradle 7.0.1 is released ( https://github.com/gradle/gradle/issues/16922#issuecomment-828217060 ) modularity.inferModulePath.set(false) @@ -55,7 +55,7 @@ java { // - .gitpod.Dockerfile // - .devcontainer/devcontainer.json#L34 and // - .github/workflows/deployment-jdk-ea.yml#L53 - languageVersion = JavaLanguageVersion.of(22) + languageVersion = JavaLanguageVersion.of(21) // See https://docs.gradle.org/current/javadoc/org/gradle/jvm/toolchain/JvmVendorSpec.html for a full list // vendor = JvmVendorSpec.AMAZON } @@ -832,8 +832,8 @@ jmh { } graalvmNative.binaries.configureEach { - javaLauncher.set(javaToolchains.launcherFor { - languageVersion = JavaLanguageVersion.of(22) - vendor = JvmVendorSpec.GRAAL_VM - }) - } + javaLauncher.set(javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(21) + vendor = JvmVendorSpec.GRAAL_VM + }) +} From aaff5c78f98aa0ef325a09642b565f54191294a0 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sat, 18 May 2024 13:46:50 +0200 Subject: [PATCH 3/7] Add CI for nativeimage --- .github/workflows/deployment.yml | 37 ++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index 030790397d1..2c9b955d342 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -34,6 +34,43 @@ concurrency: cancel-in-progress: true jobs: + nativeimage: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: 'true' + show-progress: 'false' + - name: Setup JDK + uses: actions/setup-java@v4 + with: + java-version: 21.0.2 + distribution: 'temurin' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + with: + gradle-home-cache-cleanup: true + - run: ./gradlew nativeCompile + - name: Upload to GitHub workflow artifacts store + uses: actions/upload-artifact@v4 + with: + name: JabRef-native-image-${{ matrix.os }} + path: build/native/nativeCompile + compression-level: 0 # no compression + - name: Check image (win) + if: (matrix.os == 'windows-latest') + run: | + cd build/native/nativeCompile + ./JabRef.exe --help + - name: Check image (linux, macOS) + if: (matrix.os != 'windows-latest') + run: | + cd build/native/nativeCompile + ./JabRef --help build: strategy: fail-fast: false From 0b8f6c3c1ebd9a3782777bd8b5dcaa8f85b8c9d9 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 20 May 2024 22:40:25 +0200 Subject: [PATCH 4/7] Improvements of today --- build.gradle | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index cfbeebf8ec8..9d0c26e99ef 100644 --- a/build.gradle +++ b/build.gradle @@ -57,7 +57,7 @@ java { // - .github/workflows/deployment-jdk-ea.yml#L53 languageVersion = JavaLanguageVersion.of(21) // See https://docs.gradle.org/current/javadoc/org/gradle/jvm/toolchain/JvmVendorSpec.html for a full list - // vendor = JvmVendorSpec.AMAZON + vendor = JvmVendorSpec.GRAAL_VM } } @@ -831,9 +831,39 @@ jmh { fork = 2 } -graalvmNative.binaries.configureEach { - javaLauncher.set(javaToolchains.launcherFor { - languageVersion = JavaLanguageVersion.of(21) - vendor = JvmVendorSpec.GRAAL_VM - }) +// Source: https://github.com/tinylog-org/tinylog/issues/145#issuecomment-603430594 +task generateConfiguration(type: Exec) { + group = "graal" + description = "Run application to generate the configuration for native image" + dependsOn assemble + commandLine project.gradle.gradleUserHomeDir.toPath().resolve("jdks/graalvm_community-21-amd64-windows/graalvm-community-openjdk-21.0.2+13.1/bin/java"), "-agentlib:native-image-agent=config-output-dir=" + project.buildDir.toPath().resolve("resources/main/META-INF/native-image"), "-cp", sourceSets.main.runtimeClasspath.getAsPath(), 'org.jabref.Launcher' + + doFirst { + mkdir project.buildDir.toPath().resolve("resources/main/META-INF/native-image") + } +} + + +graalvmNative { + // toolchainDetection = true + binaries { + main { + imageName = "JabRef" + mainClass = "org.jabref.Launcher" + buildArgs.add("-O4") + } + test { + buildArgs.add("-O0") + } + } + binaries.configureEach { + buildArgs.add("-H:+AddAllCharsets") + buildArgs.add("--allow-incomplete-classpath") + buildArgs.add("--verbose") + resources.autodetect() + javaLauncher.set(javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(21) + vendor = JvmVendorSpec.GRAAL_VM + }) + } } From e0f869c861f8cfdcc9db4c1ed276488000cb4d9b Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 20 May 2024 22:54:33 +0200 Subject: [PATCH 5/7] Fix stream Co-authored-by: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> --- .../protectedterms/ProtectedTermsParser.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jabref/logic/protectedterms/ProtectedTermsParser.java b/src/main/java/org/jabref/logic/protectedterms/ProtectedTermsParser.java index e0e9a54dc33..ac5c8679c8b 100644 --- a/src/main/java/org/jabref/logic/protectedterms/ProtectedTermsParser.java +++ b/src/main/java/org/jabref/logic/protectedterms/ProtectedTermsParser.java @@ -1,14 +1,15 @@ package org.jabref.logic.protectedterms; +import java.io.BufferedReader; import java.io.IOException; -import java.net.URISyntaxException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.jabref.logic.l10n.Localization; @@ -29,14 +30,9 @@ public class ProtectedTermsParser { private String location; public void readTermsFromResource(String resourceFileName, String descriptionString) { - try { - Path path = Path.of(Objects.requireNonNull(ProtectedTermsLoader.class.getResource(Objects.requireNonNull(resourceFileName))).toURI()); - readTermsList(path); - description = descriptionString; - location = resourceFileName; - } catch (URISyntaxException e1) { - LOGGER.error(""); - } + readTermsList(ProtectedTermsLoader.class.getResourceAsStream(Objects.requireNonNull(resourceFileName))); + description = descriptionString; + location = resourceFileName; } public void readTermsFromFile(Path path) { @@ -44,13 +40,26 @@ public void readTermsFromFile(Path path) { readTermsList(path); } + private void readTermsList(InputStream inputStream) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { + this.terms.addAll( + reader.lines() + .map(this::setDescription) + .filter(Objects::nonNull) + .toList() + ); + } catch (IOException e) { + LOGGER.warn("Could not read terms from input stream", e); + } + } + private void readTermsList(Path path) { if (!Files.exists(path)) { LOGGER.warn("Could not read terms from file {}", path); return; } try (Stream lines = Files.lines(path, StandardCharsets.UTF_8)) { - this.terms.addAll(lines.map(this::setDescription).filter(Objects::nonNull).collect(Collectors.toList())); + this.terms.addAll(lines.map(this::setDescription).filter(Objects::nonNull).toList()); } catch (IOException e) { LOGGER.warn("Could not read terms from file {}", path, e); } From 4a91158805a5ab7646067ded2b26f3095fef5870 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 11 Jul 2024 14:42:48 +0200 Subject: [PATCH 6/7] Fix workflow --- .github/workflows/deployment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index de7b5ed270f..66d559f4812 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -39,6 +39,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v4 From f8b37718e0b982fa5d3d984d40a80c23efca0324 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 11 Jul 2024 14:48:32 +0200 Subject: [PATCH 7/7] Update build.gradle --- build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7c808b8c1e0..159df6891dd 100644 --- a/build.gradle +++ b/build.gradle @@ -31,7 +31,7 @@ plugins { id 'org.openrewrite.rewrite' version '6.16.3' - id 'org.graalvm.buildtools.native' version '0.10.1' + id 'org.graalvm.buildtools.native' version '0.10.2' } // Enable following for debugging @@ -882,8 +882,10 @@ graalvmNative { } binaries.configureEach { buildArgs.add("-H:+AddAllCharsets") + // buildArgs.add("-H:IncludeResources=*.bst|*.xml|*.csl|*.jks) buildArgs.add("--allow-incomplete-classpath") buildArgs.add("--verbose") + buildArgs.add("--initialize-at-run-time=org.tinylog,org.slf4j") resources.autodetect() javaLauncher.set(javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(21)