From d64882060d829f06822063597d9019dc10b12f72 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Tue, 24 Jun 2025 17:10:05 +0200 Subject: [PATCH 01/28] Explore switching the Gradle build to org.gradlex.java-module plugins (#13324) Co-authored-by: Oliver Kopp Co-authored-by: Siedlerchr --- .github/workflows/binaries-ea.yml | 545 ------------------ .github/workflows/binaries.yml | 75 ++- .github/workflows/tests.yml | 126 ++++ build-logic/.gitignore | 1 + build-logic/build.gradle.kts | 2 + build-logic/settings.gradle.kts | 5 + ...ef.gradle.base.dependency-rules.gradle.kts | 437 +++++++++++++- .../org.jabref.gradle.base.targets.gradle.kts | 35 +- ...rg.jabref.gradle.build.settings.gradle.kts | 7 + jabgui/build.gradle.kts | 367 +++--------- .../{mac => macos}/Info-lite.plist.template | 0 jabgui/buildres/{mac => macos}/Info.plist | 0 .../{mac => macos}/Info.plist.template | 0 .../JabRef-background-darkAqua.png | Bin .../{mac => macos}/JabRef-background.png | Bin .../{mac => macos}/JabRef-background.tiff | Bin .../{mac => macos}/JabRef-dmg-setup.scpt | 0 .../{mac => macos}/Jabref-volume.icns | Bin jabgui/buildres/{mac => macos}/README.md | 0 .../{mac => macos}/Resources/jabrefHost.py | 0 .../bifehkofibaamoeaopjglfkddgkijdlh.json | 0 .../chromium/org.jabref.jabref.json | 0 .../firefox/org.jabref.jabref.json | 0 .../{mac => macos}/Runtime-Info.plist | 0 .../Runtime-Info.plist.template | 0 .../bibtexAssociations.properties | 0 .../buildres/{mac => macos}/info-lite.plist | 0 .../{mac => macos}/jabref.entitlements | 0 .../{mac/launcher.icns => macos/jabref.icns} | Bin jabgui/buildres/macos/launcher.icns | Bin 0 -> 257939 bytes jabgui/buildres/{mac => macos}/postinstall | 0 jabgui/buildres/windows/jabref.ico | Bin 0 -> 114743 bytes jabgui/src/main/java/module-info.java | 10 +- jabkit/build.gradle.kts | 134 +---- .../src/main/resourcesPackage/linux/.gitkeep | 0 .../src/main/resourcesPackage/macos/.gitkeep | 0 .../main/resourcesPackage/windows/.gitkeep | 0 jablib/build.gradle.kts | 39 +- jablib/src/main/java/module-info.java | 44 +- .../logic/preferences/PreviewPreferences.java | 127 ++++ jabsrv-cli/build.gradle.kts | 86 +-- jabsrv-cli/src/main/java/module-info.java | 10 +- jabsrv/build.gradle.kts | 4 +- jabsrv/src/main/java/module-info.java | 10 +- settings.gradle.kts | 12 +- versions/build.gradle.kts | 13 +- 46 files changed, 939 insertions(+), 1150 deletions(-) delete mode 100644 .github/workflows/binaries-ea.yml create mode 100644 build-logic/.gitignore create mode 100644 build-logic/src/main/kotlin/org.jabref.gradle.build.settings.gradle.kts rename jabgui/buildres/{mac => macos}/Info-lite.plist.template (100%) rename jabgui/buildres/{mac => macos}/Info.plist (100%) rename jabgui/buildres/{mac => macos}/Info.plist.template (100%) rename jabgui/buildres/{mac => macos}/JabRef-background-darkAqua.png (100%) rename jabgui/buildres/{mac => macos}/JabRef-background.png (100%) rename jabgui/buildres/{mac => macos}/JabRef-background.tiff (100%) rename jabgui/buildres/{mac => macos}/JabRef-dmg-setup.scpt (100%) rename jabgui/buildres/{mac => macos}/Jabref-volume.icns (100%) rename jabgui/buildres/{mac => macos}/README.md (100%) rename jabgui/buildres/{mac => macos}/Resources/jabrefHost.py (100%) rename jabgui/buildres/{mac => macos}/Resources/native-messaging-host/chromium/bifehkofibaamoeaopjglfkddgkijdlh.json (100%) rename jabgui/buildres/{mac => macos}/Resources/native-messaging-host/chromium/org.jabref.jabref.json (100%) rename jabgui/buildres/{mac => macos}/Resources/native-messaging-host/firefox/org.jabref.jabref.json (100%) rename jabgui/buildres/{mac => macos}/Runtime-Info.plist (100%) rename jabgui/buildres/{mac => macos}/Runtime-Info.plist.template (100%) rename jabgui/buildres/{mac => macos}/bibtexAssociations.properties (100%) rename jabgui/buildres/{mac => macos}/info-lite.plist (100%) rename jabgui/buildres/{mac => macos}/jabref.entitlements (100%) rename jabgui/buildres/{mac/launcher.icns => macos/jabref.icns} (100%) create mode 100644 jabgui/buildres/macos/launcher.icns rename jabgui/buildres/{mac => macos}/postinstall (100%) create mode 100644 jabgui/buildres/windows/jabref.ico create mode 100644 jabkit/src/main/resourcesPackage/linux/.gitkeep create mode 100644 jabkit/src/main/resourcesPackage/macos/.gitkeep create mode 100644 jabkit/src/main/resourcesPackage/windows/.gitkeep create mode 100644 jablib/src/main/java/org/jabref/logic/preferences/PreviewPreferences.java diff --git a/.github/workflows/binaries-ea.yml b/.github/workflows/binaries-ea.yml deleted file mode 100644 index bb775611e1b..00000000000 --- a/.github/workflows/binaries-ea.yml +++ /dev/null @@ -1,545 +0,0 @@ -# This workflow is a clone of "binaries.yml" -# The difference is that this workflow uses JDK early access builds (jdk-ea) to check the build of JabRef -# We separated this from the main workflow as we do not want to check on each PR if the JDK build, but only on main -name: Binaries (JDK and JavaFX early access builds) - -on: - pull_request: - types: - - opened - - synchronize - - reopened - - labeled - paths: - - .github/workflows/binaries-ea.yml - - build-logic/src/** - - '**/build.gradle.kts' - workflow_dispatch: - inputs: - notarization: - type: boolean - required: false - default: false - -permissions: - actions: write - contents: read - -env: - SpringerNatureAPIKey: ${{ secrets.SpringerNatureAPIKey }} - AstrophysicsDataSystemAPIKey: ${{ secrets.AstrophysicsDataSystemAPIKey }} - IEEEAPIKey: ${{ secrets.IEEEAPIKey }} - BiodiversityHeritageApiKey: ${{ secrets.BiodiversityHeritageApiKey}} - OSXCERT: ${{ secrets.OSX_SIGNING_CERT }} - GRADLE_OPTS: -Xmx4g -Dorg.gradle.vfs.watch=false - JAVA_OPTS: -Xmx4g - -concurrency: - group: "${{ github.workflow }}-${{ github.head_ref || github.ref }}-${{ github.event_name }}" - cancel-in-progress: true - -jobs: - conditions: - runs-on: ubuntu-latest - outputs: - upload-to-builds-jabref-org: ${{ steps.binary.outputs.upload-to-builds-jabref-org }} - secretspresent: ${{ steps.binary.outputs.secretspresent }} - # requried to avoid obsolete builds in case of labels != "dev: binaries" - should-build: ${{ steps.binary.outputs.should-build }} - should-notarize: ${{ steps.binary.outputs.should-notarize }} - steps: - - name: Determine conditions - id: binary - shell: bash - env: - BUILDJABREFPRIVATEKEY: ${{ secrets.buildJabRefPrivateKey }} - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - EVENT_NAME: ${{ github.event_name }} - LABEL_NAME: ${{ github.event.label.name }} - REPO_OWNER: ${{ github.repository_owner }} - run: | - if [[ "$GITHUB_WORKFLOW" == *"early access"* && "$REPO_OWNER" != "JabRef" ]]; then - echo "๐Ÿšซ Early access workflow for JabRef disabled for non-JabRef owner" - echo "should-build=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - if [[ "$EVENT_NAME" != "labeled" || "$LABEL_NAME" == "automerge" || "$LABEL_NAME" == "dev: binaries" ]]; then - echo "๐Ÿ“ฆ build enabled" - echo "should-build=true" >> "$GITHUB_OUTPUT" - else - echo "๐Ÿšซ build should be skipped" - echo "should-build=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - if [ -z "$BUILDJABREFPRIVATEKEY" ]; then - echo "upload-to-builds-jabref-org=false" >> "$GITHUB_OUTPUT" - echo "secretspresent=false" >> "$GITHUB_OUTPUT" - echo "๐Ÿšซ Secret BUILDJABREFPRIVATEKEY not present โ€“ skipping upload" - exit 0 - fi - echo "secretspresent=true" >> "$GITHUB_OUTPUT" - - if [[ "$GITHUB_REF" == refs/heads/gh-readonly-queue* ]]; then - echo "upload-to-builds-jabref-org=false" >> "$GITHUB_OUTPUT" - echo "๐Ÿšซ merge queue โ€“ skipping upload" - exit 0 - fi - - if [[ "${{ inputs.notarization }}" == "true" ]]; then - # This workflow runs on ubuntu-latest even for notarization for macOS; need to check later if really on macOS - echo "๐Ÿงพ macOS notarization" - echo "should-notarize=true" >> "$GITHUB_OUTPUT" - echo "โ˜๏ธ will upload" - echo "upload-to-builds-jabref-org=true" >> "$GITHUB_OUTPUT" - exit 0; - else - echo "๐Ÿšซ no macOS notarization" - echo "should-notarize=false" >> "$GITHUB_OUTPUT" - fi - - if [ "${{ github.event_name }}" != "pull_request" ]; then - echo "upload-to-builds-jabref-org=true" >> "$GITHUB_OUTPUT" - echo "โ˜๏ธ Non-PR event โ€“ will upload" - exit 0 - fi - - LABELS=$(gh api repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels --jq '.[].name') - - if echo "$LABELS" | grep -q "^dev: binaries$"; then - echo "upload-to-builds-jabref-org=true" >> "$GITHUB_OUTPUT" - echo "โ˜๏ธ Label 'dev: binaries' found โ€“ will upload" - else - echo "upload-to-builds-jabref-org=false" >> "$GITHUB_OUTPUT" - echo "๐Ÿšซ Label 'dev: binaries' not found โ€“ skipping upload" - fi - - build: - needs: [conditions] - if: ${{ needs.conditions.outputs.should-build == 'true' }} - env: - jdk_version: '24' - jdk_distribution: 'openjdk-25.0.0-ea+27' - strategy: - fail-fast: false - matrix: - include: - # if you change the os version rename all other occurrences - - os: ubuntu-22.04 - displayName: linux - archivePortable: tar -c -C jabgui/build/distribution JabRef | pigz --rsyncable > jabgui/build/distribution/JabRef-portable_linux.tar.gz && rm -R jabgui/build/distribution/JabRef - archivePortableJabKit: tar -c -C jabkit/build/distribution jabkit | pigz --rsyncable > jabkit/build/distribution/jabkit-portable_linux.tar.gz && rm -R jabkit/build/distribution/jabkit - suffix: '-ea' - archForDebianRepack: "_amd64" - - os: ubuntu-22.04-arm - displayName: linux-arm - archivePortable: tar -c -C jabgui/build/distribution JabRef | pigz --rsyncable > jabgui/build/distribution/JabRef-portable_linux_arm64.tar.gz && rm -R jabgui/build/distribution/JabRef - archivePortableJabKit: tar -c -C jabkit/build/distribution jabkit | pigz --rsyncable > jabkit/build/distribution/jabkit-portable_linux_arm64.tar.gz && rm -R jabkit/build/distribution/jabkit - suffix: '-ea_arm64' - archForDebianRepack: '_arm64' - - os: windows-latest - displayName: windows - archivePortable: 7z a -r jabgui/build/distribution/JabRef-portable_windows.zip ./jabgui/build/distribution/JabRef && rm -R jabgui/build/distribution/JabRef - archivePortableJabKit: 7z a -r jabkit/build/distribution/jabkit-portable_windows.zip ./jabkit/build/distribution/jabkit && rm -R jabkit/build/distribution/jabkit - suffix: '-ea' - - os: macos-13 # intel image - displayName: macOS - suffix: '-ea' - - os: macos-14 - displayName: macOS (ARM64) - suffix: '-ea_arm64' - archForDebianRepack: "" - runs-on: ${{ matrix.os }} - outputs: - major: ${{ steps.gitversion.outputs.Major }} - minor: ${{ steps.gitversion.outputs.Minor }} - branchname: ${{ steps.gitversion.outputs.branchName }} - name: (ea) ${{ matrix.displayName }} installer and portable version - steps: - - name: Fetch all history for all tags and branches - uses: actions/checkout@v4 - with: - fetch-depth: 0 - submodules: 'true' - show-progress: 'false' - - name: Install pigz and cache (linux) - if: (startsWith(matrix.os, 'ubuntu')) - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: pigz - version: 1.0 - - name: Install GitVersion - uses: gittools/actions/gitversion/setup@v3.2.1 - with: - versionSpec: "5.x" - - name: Run GitVersion - id: gitversion - uses: gittools/actions/gitversion/execute@v3.2.1 - - - name: Tell gradle to use JDK ${{ env.jdk_version }} (linux, Windows) - if: ${{ !startsWith(matrix.os, 'macos') }} - run: | - # Update JavaLanguageVersion - sed -i "s/JavaLanguageVersion.of..../JavaLanguageVersion.of(${{ env.jdk_version }})/" build-logic/src/main/kotlin/org.jabref.gradle.feature.compile.gradle.kts - - # Update options.release - sed -i "s/options\.release = ../options.release = ${{ env.jdk_version }}/" build-logic/src/main/kotlin/org.jabref.gradle.feature.compile.gradle.kts - - # Use default vendor - # sed -i "s#vendor = JvmVendorSpec\..*##" build-logic/src/main/kotlin/org.jabref.gradle.feature.compile.gradle.kts - - cat build-logic/src/main/kotlin/org.jabref.gradle.feature.compile.gradle.kts - - name: Tell gradle to use JDK ${{ env.jdk_version }} (macOS) - if: ${{ startsWith(matrix.os, 'macos') }} - run: | - sed -i '.bak' "s/JavaLanguageVersion.of..../JavaLanguageVersion.of(${{ env.jdk_version }})/" build-logic/src/main/kotlin/org.jabref.gradle.feature.compile.gradle.kts - sed -i '.bak' "s/options\.release = ../options.release = ${{ env.jdk_version }}/" build-logic/src/main/kotlin/org.jabref.gradle.feature.compile.gradle.kts - # sed -i '.bak' "s#vendor = JvmVendorSpec\..*##" build-logic/src/main/kotlin/org.jabref.gradle.feature.compile.gradle.kts - cat build-logic/src/main/kotlin/org.jabref.gradle.feature.compile.gradle.kts - - # region setup-JDK - - name: Setup JDK ${{ env.jdk_version }} (${{ env.jdk }}) for "java toolchain" of Gradle - if: false - uses: jdx/mise-action@v2 - with: - mise_toml: | - [tools] - java = { version = "${{ env.jdk_distribution }}", release_type = "ea" } - - name: Debug - if: false - shell: bash - run: | - set -x - set -e - echo $JAVA_HOME - java --version - - name: Make JDK known to gradle (Linux, macOS) - if: false && (matrix.os != 'windows-latest') - shell: bash - # Hint by https://github.com/gradle/gradle/issues/29355#issuecomment-2598556970 - run: ln -s ~/.local/share/mise ~/.asdf - - name: Make JDK known to gradle (Windows) - if: false && (matrix.os == 'windows-latest') - shell: bash - run: mv ~/AppData/Local/mise ~/.asdf - - name: Setup JDK for gradle itself - if: false - uses: actions/setup-java@v4 - with: - java-version: '21' - distribution: 'temurin' - - name: Setup JDK ${{ env.jdk_version }} - uses: actions/setup-java@v4 - with: - java-version: '${{ env.jdk_version }}' - distribution: 'corretto' - java-package: 'jdk' - # endregion - - # region JavaFX - - name: 'Determine latest JavaFX version' - id: javafx - shell: bash - run: | - set -e - curl -s "https://search.maven.org/solrsearch/select?q=g:org.openjfx+AND+a:javafx&rows=10&core=gav" > /tmp/versions.json - jq '[.response.docs[] | select(.v | test(".*-ea\\+.*")) | select(.v | test("^17|^18|^19|^20|^21|^22|^23") | not) | {version: .v}] | group_by(.version | capture("^(?\\d+).*").major) | map(max_by(.version))' < /tmp/versions.json > /tmp/versions-latest.json - JAVAFX=$(jq -r '.[-1].version' /tmp/versions-latest.json) - echo "Using JavaFX ${JAVAFX}" - echo "version=${JAVAFX}" >> $GITHUB_OUTPUT - - name: 'Set JavaFX ${{ steps.javafx.output.version }} (linux, Windows)' - if: ${{ !startsWith(matrix.os, 'macos') }} - shell: bash - run: | - set -e - sed -i 's/val javafx = ".*/val javafx = "${{ steps.javafx.outputs.version }}"/' versions/build.gradle.kts - - name: 'Set JavaFX ${{ steps.javafx.output.version }} (macOS)' - if: startsWith(matrix.os, 'macos') - run: | - set -e - sed -i '.bak' 's/val javafx = ".*/val javafx = "${{ steps.javafx.outputs.version }}"/' versions/build.gradle.kts - # endregion - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - - name: Prepare merged jars and modules dir - # prepareModulesDir is executing a build, which should run through even if no upload to builds.jabref.org is made - if: (startsWith(matrix.os, 'macos')) || (needs.conditions.outputs.upload-to-builds-jabref-org == 'false') - run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabgui:prepareModulesDir - - name: Setup macOS key chain - if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') - uses: slidoapp/import-codesign-certs@1923310662e8682dd05b76b612b53301f431cd5d - with: - p12-file-base64: ${{ secrets.OSX_SIGNING_CERT }} - p12-password: ${{ secrets.OSX_CERT_PWD }} - keychain-password: jabref - - name: Setup macOS key chain for app id cert - if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') - uses: slidoapp/import-codesign-certs@1923310662e8682dd05b76b612b53301f431cd5d - with: - p12-file-base64: ${{ secrets.OSX_SIGNING_CERT_APPLICATION }} - p12-password: ${{ secrets.OSX_CERT_PWD }} - create-keychain: false - keychain-password: jabref - - name: Build dmg (macOS) - if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') - shell: bash - run: | - set -e - cd jabgui - - # see https://github.com/jdx/mise/discussions/4973 - # eval $(mise hook-env -f | grep 'export JAVA_HOME') - # eval $(mise hook-env -f | grep 'export PATH') - # echo $JAVA_HOME - - jpackage \ - --module org.jabref/org.jabref.Launcher \ - --module-path $JAVA_HOME/jmods/:build/jlinkbase/jlinkjars \ - --add-modules org.jabref,org.jabref.merged.module \ - --add-modules jdk.incubator.vector \ - --dest build/distribution \ - --app-content buildres/mac/Resources \ - --name JabRef \ - --app-version ${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }} \ - --verbose \ - --mac-sign \ - --vendor "JabRef e.V." \ - --mac-package-identifier JabRef \ - --mac-package-name JabRef \ - --type dmg --mac-signing-key-user-name "JabRef e.V. (6792V39SK3)" \ - --mac-package-signing-prefix org.jabref \ - --mac-entitlements buildres/mac/jabref.entitlements \ - --icon src/main/resources/icons/jabref.icns \ - --resource-dir buildres/mac \ - --file-associations buildres/mac/bibtexAssociations.properties \ - --jlink-options --bind-services \ - --java-options -XX:+UnlockExperimentalVMOptions \ - --java-options -XX:+UseCompactObjectHeaders \ - --java-options -XX:+UseZGC --java-options -XX:+ZUncommit \ - --java-options -XX:+UseStringDeduplication \ - --java-options --add-exports=javafx.base/com.sun.javafx.event=org.jabref.merged.module \ - --java-options --add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.graphics/javafx.scene=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control.skin=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref \ - --java-options --add-exports=javafx.base/com.sun.javafx.event=org.jabref \ - --java-options --add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.graphics/javafx.scene=org.jabref \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.base/javafx.collections=org.jabref \ - --java-options --add-opens=javafx.base/javafx.collections.transformation=org.jabref \ - --java-options --add-modules=jdk.incubator.vector - - name: Build pkg (macOS) - if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') - shell: bash - run: | - set -e - cd jabgui - - # see https://github.com/jdx/mise/discussions/4973 - # eval $(mise hook-env -f | grep 'export JAVA_HOME') - # eval $(mise hook-env -f | grep 'export PATH') - # echo $JAVA_HOME - - jpackage \ - --module org.jabref/org.jabref.Launcher \ - --module-path $JAVA_HOME/jmods/:build/jlinkbase/jlinkjars \ - --add-modules org.jabref,org.jabref.merged.module \ - --add-modules jdk.incubator.vector \ - --dest build/distribution \ - --app-content buildres/mac/Resources \ - --name JabRef \ - --app-version ${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }} \ - --verbose \ - --mac-sign \ - --vendor "JabRef e.V." \ - --mac-package-identifier JabRef \ - --mac-package-name JabRef \ - --type pkg --mac-signing-key-user-name "JabRef e.V. (6792V39SK3)" \ - --mac-package-signing-prefix org.jabref \ - --mac-entitlements buildres/mac/jabref.entitlements \ - --icon src/main/resources/icons/jabref.icns \ - --resource-dir buildres/mac \ - --file-associations buildres/mac/bibtexAssociations.properties \ - --jlink-options --bind-services \ - --java-options --add-exports=javafx.base/com.sun.javafx.event=org.jabref.merged.module \ - --java-options --add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.graphics/javafx.scene=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref \ - --java-options --add-exports=javafx.base/com.sun.javafx.event=org.jabref \ - --java-options --add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.graphics/javafx.scene=org.jabref \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.base/javafx.collections=org.jabref \ - --java-options --add-opens=javafx.base/javafx.collections.transformation=org.jabref \ - --java-options --add-modules=jdk.incubator.vector - - name: Rename files for mac - if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') - shell: bash - run: | - cd jabgui - mv build/distribution/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}.dmg build/distribution/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.dmg - mv build/distribution/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}.pkg build/distribution/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.pkg - - name: Build runtime image and installer (linux, Windows) - if: ${{ !startsWith(matrix.os, 'macos') }} - shell: bash - run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabgui:jpackage - - name: Package JabGui application image (linux, Windows) - if: ${{ !startsWith(matrix.os, 'macos') }} - shell: bash - run: | - set -e - ${{ matrix.archivePortable }} - - name: Rename files - if: ${{ !startsWith(matrix.os, 'macos') }} - shell: pwsh - run: | - get-childitem -Path jabgui/build/distribution/* | rename-item -NewName {$_.name -replace "${{ steps.gitversion.outputs.AssemblySemVer }}","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}"} - get-childitem -Path jabgui/build/distribution/* | rename-item -NewName {$_.name -replace "portable","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}-portable"} - - name: Repack deb file for Debian - if: (startsWith(matrix.os, 'ubuntu')) - shell: bash - run: | - cd jabgui/build/distribution - ls -l - ar x jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}${{ matrix.archForDebianRepack }}.deb - zstd -d < control.tar.zst | xz > control.tar.xz - zstd -d < data.tar.zst | xz > data.tar.xz - ar -m -c -a sdsd jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}${{ matrix.archForDebianRepack }}_repackaged.deb debian-binary control.tar.xz data.tar.xz - rm debian-binary control.tar.* data.tar.* - mv -f jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}${{ matrix.archForDebianRepack }}_repackaged.deb jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.deb - - - name: Build JabKit - shell: bash - run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabkit:jpackage - - name: Remove JabKit app build (macOS) - if: ${{ startsWith(matrix.os, 'macos') }} - run: rm -rf jabkit/build/distribution/jabkit.app - - name: Package JabKit application image (linux, Windows) - if: ${{ !startsWith(matrix.os, 'macos') && (needs.conditions.outputs.secretspresent == 'true') }} - shell: bash - run: | - set -e - ${{ matrix.archivePortableJabKit }} - - - name: Setup SSH key - if: (needs.conditions.outputs.upload-to-builds-jabref-org == 'true') - run: | - echo "${{ secrets.buildJabRefPrivateKey }}" > sshkey - chmod 600 sshkey - - name: Check disk space on builds.jabref.org - if: (needs.conditions.outputs.upload-to-builds-jabref-org == 'true') - id: diskspace - shell: bash - run: | - USAGE=$(ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no jrrsync@build-upload.jabref.org \ - "df --output=pcent /var/www/builds.jabref.org | tail -n1 | tr -dc '0-9'") - echo "Remote usage: $USAGE%" - if [ "$USAGE" -lt 90 ]; then - echo "available=true" >> "$GITHUB_OUTPUT" - else - echo "available=false" >> "$GITHUB_OUTPUT" - fi - - - name: Setup rsync (macOS) - if: ${{ (steps.diskspace.outputs.available == 'true') && (startsWith(matrix.os, 'macos') && (needs.conditions.outputs.upload-to-builds-jabref-org == 'true')) }} - run: brew install rsync - - name: Setup rsync (Windows) - if: ${{ (steps.diskspace.outputs.available == 'true') && (matrix.os == 'windows-latest') }} - # We want to have rsync available at this place to avoid uploading and downloading from GitHub artifact store (taking > 5 minutes in total) - # We cannot use "action-rsyncer", because that requires Docker which is unavailable on Windows - # We cannot use "setup-rsync", because that does not work on Windows - # We do not use egor-tensin/setup-cygwin@v4, because it replaces the default shell - run: choco install --no-progress rsync - - name: Upload jabgui to builds.jabref.org (Windows) - if: ${{ (steps.diskspace.outputs.available == 'true') && (matrix.os == 'windows-latest') }} - shell: cmd - # for rsync installed by chocolatey, we need the ssh.exe delivered with that installation - run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - - name: Upload jabkkit to builds.jabref.org (Windows) - if: ${{ (steps.diskspace.outputs.available == 'true') && (matrix.os == 'windows-latest') }} - shell: cmd - # for rsync installed by chocolatey, we need the ssh.exe delivered with that installation - run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - - name: Upload jabgui to builds.jabref.org (linux, macOS) - if: ${{ (steps.diskspace.outputs.available == 'true') && (startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu')) }} - shell: bash - run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - - name: Upload jabkit to builds.jabref.org (linux, macOS) - if: ${{ (steps.diskspace.outputs.available == 'true') && (startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu')) }} - shell: bash - run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - - name: Upload to GitHub workflow artifacts store (macOS) - if: ${{ (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.should-notarize == 'true') }} - uses: actions/upload-artifact@v4 - with: - # tbn = to-be-notarized - name: JabRef-${{ matrix.os }}-tbn - path: | - jabgui/build/distribution - jabkit/build/distribution - compression-level: 0 # no compression - - name: Upload to GitHub workflow artifacts store - if: ${{ (needs.conditions.outputs.upload-to-builds-jabref-org == 'false') }} - uses: actions/upload-artifact@v4 - with: - name: JabRef-${{ matrix.os }} - path: | - jabgui/build/distribution - jabkit/build/distribution - compression-level: 0 # no compression - notarize: - # Outsourced in a separate job to be able to rerun if this fails for timeouts - name: macOS notarization - needs: [conditions, build] - if: ${{ needs.conditions.outputs.should-notarize == 'true' }} - strategy: - # Ensure that calls to Apple are sequentially made - max-parallel: 1 - matrix: - include: - - os: macos-14 - displayName: macOS (ARM64) - suffix: '-ea_arm64' - - os: macos-13 # intel image - displayName: macOS - suffix: '-ea' - runs-on: ${{ matrix.os }} - steps: - - name: Download from GitHub workflow artifacts store (macOS) - uses: actions/download-artifact@v4 - with: - name: JabRef-${{ matrix.os }}-tbn - - name: Notarize dmg - shell: bash - run: | - cd jabgui - find . -type f - xcrun notarytool store-credentials "notarytool-profile" --apple-id "vorstand@jabref.org" --team-id "6792V39SK3" --password "${{ secrets.OSX_NOTARIZATION_APP_PWD }}" - xcrun notarytool submit build/distribution/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg --keychain-profile "notarytool-profile" --wait - xcrun stapler staple build/distribution/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg - - name: Notarize pkg - shell: bash - run: | - cd jabgui - xcrun notarytool store-credentials "notarytool-profile" --apple-id "vorstand@jabref.org" --team-id "6792V39SK3" --password "${{ secrets.OSX_NOTARIZATION_APP_PWD }}" - xcrun notarytool submit build/distribution/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg --keychain-profile "notarytool-profile" --wait - xcrun stapler staple build/distribution/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg - - name: Upload to builds.jabref.org - shell: bash - run: | - echo "${{ secrets.buildJabRefPrivateKey }}" > sshkey - chmod 600 sshkey - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }}/ diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index f3f0ea71fd9..8718d560668 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -138,20 +138,20 @@ jobs: # if you change the os version rename all other occurrences - os: ubuntu-22.04 displayName: linux - archivePortable: tar -c -C jabgui/build/distribution JabRef | pigz --rsyncable > jabgui/build/distribution/JabRef-portable_linux.tar.gz && rm -R jabgui/build/distribution/JabRef - archivePortableJabKit: tar -c -C jabkit/build/distribution jabkit | pigz --rsyncable > jabkit/build/distribution/jabkit-portable_linux.tar.gz && rm -R jabkit/build/distribution/jabkit + archivePortable: tar -c -C jabgui/build/distributions JabRef | pigz --rsyncable > jabgui/build/distributions/JabRef-portable_linux.tar.gz && rm -R jabgui/build/distributions/JabRef + archivePortableJabKit: tar -c -C jabkit/build/distributions jabkit | pigz --rsyncable > jabkit/build/distributions/jabkit-portable_linux.tar.gz && rm -R jabkit/build/distributions/jabkit suffix: '' archForDebianRepack: '_amd64' - os: ubuntu-22.04-arm displayName: linux-arm - archivePortable: tar -c -C jabgui/build/distribution JabRef | pigz --rsyncable > jabgui/build/distribution/JabRef-portable_linux_arm64.tar.gz && rm -R jabgui/build/distribution/JabRef - archivePortableJabKit: tar -c -C jabkit/build/distribution jabkit | pigz --rsyncable > jabkit/build/distribution/jabkit-portable_linux_arm64.tar.gz && rm -R jabkit/build/distribution/jabkit + archivePortable: tar -c -C jabgui/build/distributions JabRef | pigz --rsyncable > jabgui/build/distributions/JabRef-portable_linux_arm64.tar.gz && rm -R jabgui/build/distributions/JabRef + archivePortableJabKit: tar -c -C jabkit/build/distributions jabkit | pigz --rsyncable > jabkit/build/distributions/jabkit-portable_linux_arm64.tar.gz && rm -R jabkit/build/distributions/jabkit suffix: '_arm64' archForDebianRepack: '_arm64' - os: windows-latest displayName: windows - archivePortable: 7z a -r jabgui/build/distribution/JabRef-portable_windows.zip ./jabgui/build/distribution/JabRef && rm -R jabgui/build/distribution/JabRef - archivePortableJabKit: 7z a -r jabkit/build/distribution/jabkit-portable_windows.zip ./jabkit/build/distribution/jabkit && rm -R jabkit/build/distribution/jabkit + archivePortable: 7z a -r jabgui/build/distributions/JabRef-portable_windows.zip ./jabgui/build/distributions/JabRef && rm -R jabgui/build/distributions/JabRef + archivePortableJabKit: 7z a -r jabkit/build/distributions/jabkit-portable_windows.zip ./jabkit/build/distributions/jabkit && rm -R jabkit/build/distributions/jabkit suffix: '' archForDebianRepack: '' - os: macos-13 # intel image @@ -175,6 +175,12 @@ jobs: fetch-depth: 0 submodules: 'true' show-progress: 'false' + - name: Fetch preview of java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Install pigz and cache (linux) if: (startsWith(matrix.os, 'ubuntu')) uses: awalsh128/cache-apt-pkgs-action@latest @@ -215,10 +221,6 @@ jobs: - name: Basic build (assemble) run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" assemble - - name: Prepare merged jars and modules dir - # prepareModulesDir is executing a build, which should run through even if no upload to builds.jabref.org is made - if: (startsWith(matrix.os, 'macos')) || (needs.conditions.outputs.upload-to-builds-jabref-org == 'false') - run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabgui:prepareModulesDir - name: Setup macOS key chain if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') uses: slidoapp/import-codesign-certs@1923310662e8682dd05b76b612b53301f431cd5d @@ -246,7 +248,7 @@ jobs: --module-path $JAVA_HOME/jmods/:build/jlinkbase/jlinkjars \ --add-modules org.jabref,org.jabref.merged.module \ --add-modules jdk.incubator.vector \ - --dest build/distribution \ + --dest build/distributions \ --app-content buildres/mac/Resources \ --name JabRef \ --app-version ${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }} \ @@ -294,7 +296,7 @@ jobs: --module-path $JAVA_HOME/jmods/:build/jlinkbase/jlinkjars \ --add-modules org.jabref,org.jabref.merged.module \ --add-modules jdk.incubator.vector \ - --dest build/distribution \ + --dest build/distributions \ --app-content buildres/mac/Resources \ --name JabRef \ --app-version ${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }} \ @@ -330,8 +332,9 @@ jobs: shell: bash run: | cd jabgui - mv build/distribution/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}.dmg build/distribution/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.dmg - mv build/distribution/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}.pkg build/distribution/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.pkg + ls build/distributions + mv build/distributions/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}.dmg build/distributions/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.dmg + mv build/distributions/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}.pkg build/distributions/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.pkg - name: Build runtime image and installer (linux, Windows) if: ${{ !startsWith(matrix.os, 'macos') }} shell: bash @@ -341,18 +344,24 @@ jobs: shell: bash run: | set -e - ${{ matrix.archivePortable }} + ls -la jabgui/build/distributions + # TODO: portable version is currently very different + # ${{ matrix.archivePortable }} - name: Rename files if: ${{ !startsWith(matrix.os, 'macos') }} shell: pwsh run: | - get-childitem -Path jabgui/build/distribution/* | rename-item -NewName {$_.name -replace "${{ steps.gitversion.outputs.AssemblySemVer }}","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}"} - get-childitem -Path jabgui/build/distribution/* | rename-item -NewName {$_.name -replace "portable","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}-portable"} + ls jabgui/build/distributions + # get-childitem -Path jabgui/build/distributions/* | rename-item -NewName {$_.name -replace "${{ steps.gitversion.outputs.AssemblySemVer }}","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}"} + # get-childitem -Path jabgui/build/distributions/* | rename-item -NewName {$_.name -replace "portable","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}-portable"} + ls jabgui/build/packages + get-childitem -Path 'jabgui/build/packages/*/*' | rename-item -NewName {$_.name -replace "${{ steps.gitversion.outputs.AssemblySemVer }}","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}"} + get-childitem -Path 'jabgui/build/packages/*/*' | rename-item -NewName {$_.name -replace "portable","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}-portable"} - name: Repack deb file for Debian if: (startsWith(matrix.os, 'ubuntu')) shell: bash run: | - cd jabgui/build/distribution + cd jabgui/build/packages/${{ matrix. os}} ls -l ar x jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}${{ matrix.archForDebianRepack }}.deb rm jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}${{ matrix.archForDebianRepack }}.deb @@ -363,17 +372,19 @@ jobs: mv -f jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}${{ matrix.archForDebianRepack }}_repackaged.deb jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.deb - name: Build JabKit + if: ${{ !startsWith(matrix.os, 'macos') }} shell: bash run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabkit:jpackage - name: Remove JabKit app build (macOS) - if: ${{ startsWith(matrix.os, 'macos') }} - run: rm -rf jabkit/build/distribution/jabkit.app + if: ${{ false && startsWith(matrix.os, 'macos') }} + run: rm -rf jabkit/build/distributions/jabkit.app - name: Package JabKit application image (linux, Windows) if: ${{ !startsWith(matrix.os, 'macos') && (needs.conditions.outputs.secretspresent == 'true') }} shell: bash run: | set -e - ${{ matrix.archivePortableJabKit }} + # TODO: portable version is currently very different + # ${{ matrix.archivePortableJabKit }} # region Upload to builds.jabref.org / GitHub artifacts store - name: Setup SSH key @@ -409,23 +420,23 @@ jobs: shell: cmd # for rsync installed by chocolatey, we need the ssh.exe delivered with that installation run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload jabkkit to builds.jabref.org (Windows) if: ${{ (steps.diskspace.outputs.available == 'true') && (matrix.os == 'windows-latest') }} shell: cmd # for rsync installed by chocolatey, we need the ssh.exe delivered with that installation run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload jabgui to builds.jabref.org (linux, macOS) if: ${{ (steps.diskspace.outputs.available == 'true') && (startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu')) }} shell: bash run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload jabkit to builds.jabref.org (linux, macOS) if: ${{ (steps.diskspace.outputs.available == 'true') && (startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu')) }} shell: bash run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload to GitHub workflow artifacts store (macOS) if: ${{ (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.should-notarize == 'true') }} uses: actions/upload-artifact@v4 @@ -433,8 +444,8 @@ jobs: # tbn = to-be-notarized name: JabRef-${{ matrix.os }}-tbn path: | - jabgui/build/distribution - jabkit/build/distribution + jabgui/build/distributions + jabkit/build/distributions compression-level: 0 # no compression # endregion @@ -481,18 +492,18 @@ jobs: cd jabgui find . -type f xcrun notarytool store-credentials "notarytool-profile" --apple-id "vorstand@jabref.org" --team-id "6792V39SK3" --password "${{ secrets.OSX_NOTARIZATION_APP_PWD }}" - xcrun notarytool submit build/distribution/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg --keychain-profile "notarytool-profile" --wait - xcrun stapler staple build/distribution/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg + xcrun notarytool submit build/distributions/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg --keychain-profile "notarytool-profile" --wait + xcrun stapler staple build/distributions/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg - name: Notarize pkg shell: bash run: | cd jabgui xcrun notarytool store-credentials "notarytool-profile" --apple-id "vorstand@jabref.org" --team-id "6792V39SK3" --password "${{ secrets.OSX_NOTARIZATION_APP_PWD }}" - xcrun notarytool submit build/distribution/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg --keychain-profile "notarytool-profile" --wait - xcrun stapler staple build/distribution/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg + xcrun notarytool submit build/distributions/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg --keychain-profile "notarytool-profile" --wait + xcrun stapler staple build/distributions/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg - name: Upload to builds.jabref.org shell: bash run: | echo "${{ secrets.buildJabRefPrivateKey }}" > sshkey chmod 600 sshkey - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distribution/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }}/ + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }}/ diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3ff68ce43ea..bdc14fe182d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -34,6 +34,12 @@ jobs: with: submodules: 'true' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK uses: actions/setup-java@v4 with: @@ -59,6 +65,12 @@ jobs: with: submodules: 'true' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK uses: actions/setup-java@v4 with: @@ -79,6 +91,12 @@ jobs: with: submodules: 'true' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK uses: actions/setup-java@v4 with: @@ -101,6 +119,12 @@ jobs: with: submodules: 'false' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: markdownlint-cli2-action uses: DavidAnson/markdownlint-cli2-action@v20 with: @@ -117,6 +141,12 @@ jobs: with: submodules: 'false' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Generate JBang cache key id: cache-key shell: bash @@ -157,6 +187,12 @@ jobs: submodules: 'false' show-progress: 'false' fetch-depth: 0 + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Cache clparse jar id: cache-clparse uses: actions/cache@v4 @@ -183,6 +219,12 @@ jobs: steps: - name: Checkout source uses: actions/checkout@v4 + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK uses: actions/setup-java@v4 with: @@ -204,6 +246,12 @@ jobs: with: submodules: 'true' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK uses: actions/setup-java@v4 with: @@ -253,6 +301,12 @@ jobs: with: submodules: 'true' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK uses: actions/setup-java@v4 with: @@ -288,6 +342,12 @@ jobs: with: submodules: 'true' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK uses: actions/setup-java@v4 with: @@ -310,6 +370,12 @@ jobs: with: submodules: 'false' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK uses: actions/setup-java@v4 with: @@ -335,6 +401,12 @@ jobs: with: submodules: 'false' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - run: jbang build .jbang/CheckoutPR.java - run: jbang build .jbang/CloneJabRef.java - run: jbang build .jbang/JabKitLauncher.java @@ -376,6 +448,12 @@ jobs: with: submodules: 'true' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK if: github.ref == 'refs/heads/main' uses: actions/setup-java@v4 @@ -408,6 +486,12 @@ jobs: - uses: actions/checkout@v4 with: show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Set up JDK uses: actions/setup-java@v4 with: @@ -428,6 +512,12 @@ jobs: - uses: actions/checkout@v4 with: show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - uses: gradle/actions/wrapper-validation@v4 mandatory-checks-section-exists: @@ -449,6 +539,12 @@ jobs: with: submodules: 'false' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Check for existence of Mandatory Checks section id: check_mandatory_section @@ -485,6 +581,12 @@ jobs: with: submodules: 'false' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Check for PR checklist id: check_changelog_modification run: | @@ -528,6 +630,12 @@ jobs: - uses: actions/checkout@v4 with: show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Merge Conflict finder uses: olivernybroe/action-conflict-finder@v4.1 @@ -539,6 +647,12 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Check force push id: force_push_check run: | @@ -563,6 +677,12 @@ jobs: with: submodules: true show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Check for submodule modifications id: check_submodule run: | @@ -613,6 +733,12 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Check PR body for changelog note id: changelog_check run: | diff --git a/build-logic/.gitignore b/build-logic/.gitignore new file mode 100644 index 00000000000..982b2c99b17 --- /dev/null +++ b/build-logic/.gitignore @@ -0,0 +1 @@ +java-module-packaging \ No newline at end of file diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 88e4031609f..a04a0abcd87 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -13,7 +13,9 @@ dependencies { implementation("com.autonomousapps:dependency-analysis-gradle-plugin:2.18.0") implementation("com.github.andygoossens:gradle-modernizer-plugin:1.11.0") implementation("org.gradlex:extra-java-module-info:1.12") + implementation("org.gradlex:java-module-dependencies:1.9.1") implementation("org.gradlex:java-module-packaging:1.0.1") // required for platform-specific packaging of JavaFX dependencies implementation("org.gradlex:java-module-testing:1.7") implementation("org.gradlex:jvm-dependency-conflict-resolution:2.4") + implementation("org.gradle.toolchains:foojay-resolver:1.0.0") } diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index 7fbbd448ef1..19c45905352 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -1 +1,6 @@ rootProject.name = "build-logic" + +// If this is not found: +// - clone https://github.com/gradlex-org/java-module-packaging next to this file +// - switch to branch 'preview' and pull +includeBuild("java-module-packaging") diff --git a/build-logic/src/main/kotlin/org.jabref.gradle.base.dependency-rules.gradle.kts b/build-logic/src/main/kotlin/org.jabref.gradle.base.dependency-rules.gradle.kts index 440544fc04a..06991eda36d 100644 --- a/build-logic/src/main/kotlin/org.jabref.gradle.base.dependency-rules.gradle.kts +++ b/build-logic/src/main/kotlin/org.jabref.gradle.base.dependency-rules.gradle.kts @@ -1,8 +1,13 @@ plugins { id("org.gradlex.extra-java-module-info") id("org.gradlex.jvm-dependency-conflict-resolution") + id("org.gradlex.java-module-dependencies") // only for mappings at the moment } +// TODO remove to translate 'requires' from 'module-info.java' to Gradle dependencies +// and remove 'dependencies {}' block from build.gradle files +javaModuleDependencies { analyseOnly = true } + jvmDependencyConflicts { consistentResolution { platform(":versions") @@ -28,6 +33,12 @@ jvmDependencyConflicts.patch { removeDependency("org.checkerframework:checker-qual") removeDependency("com.google.errorprone:error_prone_annotations") } + module("org.jetbrains.kotlin:kotlin-stdlib") { + removeDependency("org.jetbrains.kotlin:kotlin-stdlib-common") // not needed + } + module("com.konghq:unirest-modules-gson") { + addApiDependency("com.konghq:unirest-java-core") + } module("com.github.tomtung:latex2unicode_2.13") { removeDependency("com.lihaoyi:fastparse_2.13") addApiDependency("com.lihaoyi:fastparse:2.3.3") @@ -41,16 +52,375 @@ jvmDependencyConflicts.patch { // workaround for https://github.com/wiremock/wiremock/issues/2874 addApiDependency("com.github.koppor:wiremock-slf4j-spi-shim") } + module("org.apache.logging.log4j:log4j-to-slf4j") { + // remove non-module annotation libraries only used at compile time + removeDependency("com.github.spotbugs:spotbugs-annotations") + removeDependency("org.osgi:org.osgi.annotation.versioning") + removeDependency("org.osgi:org.osgi.annotation.bundle") + removeDependency("biz.aQute.bnd:biz.aQute.bnd.annotation") + } + module("org.apache.logging.log4j:log4j-api") { + // remove non-module annotation libraries only used at compile time + removeDependency("com.github.spotbugs:spotbugs-annotations") + removeDependency("org.osgi:org.osgi.annotation.versioning") + removeDependency("org.osgi:org.osgi.annotation.bundle") + removeDependency("biz.aQute.bnd:biz.aQute.bnd.annotation") + } + module("org.wiremock:wiremock") { + removeDependency("net.sf.jopt-simple:jopt-simple") + } + module("org.testfx:testfx-core") { + removeDependency("org.osgi:org.osgi.core") + } + module("org.glassfish.jersey.containers:jersey-container-servlet") { + } + module("org.glassfish.jersey.containers:jersey-container-servlet-core") { + } + module("org.xmlunit:xmlunit-legacy") { + removeDependency("junit:junit") + } } extraJavaModuleInfo { - failOnMissingModuleInfo = false - failOnAutomaticModules = false - // skipLocalJars = true - deriveAutomaticModuleNamesFromFileNames = true + failOnAutomaticModules = true + + knownModule("com.github.hypfvieh:dbus-java-core", "org.freedesktop.dbus") + knownModule("com.github.hypfvieh:dbus-java-transport-native-unixsocket", "org.freedesktop.dbus.transport.jre") + + module("ai.djl.huggingface:tokenizers", "ai.djl.tokenizers") { + exportAllPackages() + requires("ai.djl.api") + requires("org.slf4j") + } + module("ai.djl.pytorch:pytorch-engine", "ai.djl.pytorch_engine") { + exportAllPackages() + requires("ai.djl.api") + requires("org.slf4j") + } + module("ai.djl.pytorch:pytorch-model-zoo", "ai.djl.pytorch_model_zoo") { + exportAllPackages() + requires("ai.djl.api") + requires("org.slf4j") + } + module("ai.djl:api", "ai.djl.api") { + exportAllPackages() + requires("com.google.gson") + requires("org.slf4j") + uses("ai.djl.engine.EngineProvider") + uses("ai.djl.repository.zoo.ZooProvider") + uses("ai.djl.repository.RepositoryFactory") + } + module("at.favre.lib:hkdf", "at.favre.lib.hkdf") + module("com.github.javakeyring:java-keyring", "com.github.java.keyring") + module("com.github.tomtung:latex2unicode_2.13", "com.github.tomtung.latex2unicode") + module("com.googlecode.plist:dd-plist", "com.googlecode.dd.plist") + module("com.h2database:h2-mvstore", "com.h2database.mvstore") + module("com.ibm.icu:icu4j", "com.ibm.icu") + module("com.knuddels:jtokkit", "com.knuddels.jtokkit") + module("com.konghq:unirest-java-core", "com.konghq.unirest.java.core") { + exportAllPackages() + requires("java.net.http") + uses("kong.unirest.core.json.JsonEngine") + } + module("com.konghq:unirest-modules-gson", "com.konghq.unirest.modules.gson") + module("com.lihaoyi:fastparse", "com.lihaoyi.fastparse") + module("com.lihaoyi:geny", "com.lihaoyi.geny") + module("com.lihaoyi:sourcecode", "com.lihaoyi.sourcecode") + module("com.squareup.okhttp3:okhttp", "okhttp3") + module("com.squareup.okhttp3:okhttp-sse", "okhttp3.sse") + module("com.squareup.okio:okio", "okio") + module("com.squareup.retrofit2:converter-jackson", "retrofit2.converter.jackson") + module("com.squareup.retrofit2:retrofit", "retrofit2") + module("com.vladsch.flexmark:flexmark", "com.vladsch.flexmark") + module("com.vladsch.flexmark:flexmark-ext-emoji", "com.vladsch.flexmark.ext.emoji") + module("com.vladsch.flexmark:flexmark-ext-gfm-strikethrough", "com.vladsch.flexmark.ext.gfm.strikethrough") + module("com.vladsch.flexmark:flexmark-ext-ins", "com.vladsch.flexmark.ext.ins") + module("com.vladsch.flexmark:flexmark-ext-superscript", "com.vladsch.flexmark.ext.superscript") + module("com.vladsch.flexmark:flexmark-ext-tables", "com.vladsch.flexmark.ext.tables") + module("com.vladsch.flexmark:flexmark-ext-wikilink", "com.vladsch.flexmark.ext.wikilink") + module("com.vladsch.flexmark:flexmark-html2md-converter", "com.vladsch.flexmark.html2md.converter") + module("com.vladsch.flexmark:flexmark-jira-converter", "com.vladsch.flexmark.jira.converter") + module("com.vladsch.flexmark:flexmark-util", "com.vladsch.flexmark.util") + module("com.vladsch.flexmark:flexmark-util-ast", "com.vladsch.flexmark.util.ast") + module("com.vladsch.flexmark:flexmark-util-builder", "com.vladsch.flexmark.util.builder") + module("com.vladsch.flexmark:flexmark-util-collection", "com.vladsch.flexmark.util.collection") + module("com.vladsch.flexmark:flexmark-util-data", "com.vladsch.flexmark.util.data") + module("com.vladsch.flexmark:flexmark-util-dependency", "com.vladsch.flexmark.util.dependency") + module("com.vladsch.flexmark:flexmark-util-format", "com.vladsch.flexmark.util.format") + module("com.vladsch.flexmark:flexmark-util-html", "com.vladsch.flexmark.util.html") + module("com.vladsch.flexmark:flexmark-util-misc", "com.vladsch.flexmark.util.misc") + module("com.vladsch.flexmark:flexmark-util-options", "com.vladsch.flexmark.util.options") + module("com.vladsch.flexmark:flexmark-util-sequence", "com.vladsch.flexmark.util.sequence") + module("com.vladsch.flexmark:flexmark-util-visitor", "com.vladsch.flexmark.util.visitor") + module("commons-beanutils:commons-beanutils", "commons.beanutils") + module("commons-collections:commons-collections", "commons.collections") + module("commons-digester:commons-digester", "commons.digester") + module("de.rototor.jeuclid:jeuclid-core", "de.rototor.jeuclid.core") + module("de.rototor.snuggletex:snuggletex-core", "de.rototor.snuggletex.core") + module("de.rototor.snuggletex:snuggletex-jeuclid", "de.rototor.snuggletex.jeuclid") + module("de.swiesend:secret-service", "de.swiesend.secret.service") + module("de.undercouch:citeproc-java", "de.undercouch.citeproc.java") { + exportAllPackages() + requires("java.xml") + requires("org.antlr.antlr4.runtime") + requires("org.apache.commons.lang3") + requires("org.apache.commons.text") + requires("org.jbibtex") + // Compile time only + // requires("jackson.annotations") + } + module("dev.langchain4j:langchain4j", "dev.langchain4j") + module("dev.langchain4j:langchain4j-core", "dev.langchain4j.core") + module("dev.langchain4j:langchain4j-google-ai-gemini", "dev.langchain4j.google.ai.gemini") + module("dev.langchain4j:langchain4j-http-client", "dev.langchain4j.http.client") + module("dev.langchain4j:langchain4j-http-client-jdk", "dev.langchain4j.http.client.jdk") + module("dev.langchain4j:langchain4j-hugging-face", "dev.langchain4j.hugging.face") + module("dev.langchain4j:langchain4j-mistral-ai", "dev.langchain4j.mistral.ai") + module("dev.langchain4j:langchain4j-open-ai", "dev.langchain4j.open.ai") + module("eu.lestard:doc-annotations", "eu.lestard.doc.annotations") + module("info.debatty:java-string-similarity", "info.debatty.java.string.similarity") + module("io.github.adr:e-adr", "io.github.adr") + module("io.github.java-diff-utils:java-diff-utils", "io.github.javadiffutils") + module("io.zonky.test.postgres:embedded-postgres-binaries-darwin-amd64", "io.zonky.test.postgres.embedded.postgres.binaries.darwin.amd64") + module("io.zonky.test.postgres:embedded-postgres-binaries-darwin-arm64v8", "io.zonky.test.postgres.embedded.postgres.binaries.darwin.arm64v8") + module("io.zonky.test.postgres:embedded-postgres-binaries-linux-amd64", "io.zonky.test.postgres.embedded.postgres.binaries.linux.amd64") + module("io.zonky.test.postgres:embedded-postgres-binaries-linux-amd64-alpine", "io.zonky.test.postgres.embedded.postgres.binaries.linux.amd64.alpine") + module("io.zonky.test.postgres:embedded-postgres-binaries-linux-arm64v8", "io.zonky.test.postgres.embedded.postgres.binaries.linux.arm64v8") + module("io.zonky.test.postgres:embedded-postgres-binaries-windows-amd64", "io.zonky.test.postgres.embedded.postgres.binaries.windows.amd64") + module("net.harawata:appdirs", "net.harawata.appdirs") + module("net.java.dev.jna:jna", "com.sun.jna") { + patchRealModule() + exportAllPackages() + requires("java.logging") + } + module("net.java.dev.jna:jna-platform", "com.sun.jna.platform") + module("net.jcip:jcip-annotations", "net.jcip.annotations") + module("net.jodah:typetools", "net.jodah.typetools") + module("org.abego.treelayout:org.abego.treelayout.core", "org.abego.treelayout.core") + module("org.antlr:antlr4-runtime", "org.antlr.antlr4.runtime") + module("org.apache.httpcomponents.client5:httpclient5", "org.apache.httpcomponents.client5.httpclient5") + module("org.apache.httpcomponents.core5:httpcore5", "org.apache.httpcomponents.core5.httpcore5") + module("org.apache.httpcomponents.core5:httpcore5-h2", "org.apache.httpcomponents.core5.httpcore5.h2") + module("org.apache.httpcomponents:httpclient", "org.apache.httpcomponents.httpclient") + module("org.apache.opennlp:opennlp-tools", "org.apache.opennlp.tools") + module("org.apache.pdfbox:fontbox", "org.apache.fontbox") { + requires("java.desktop") + requires("org.apache.pdfbox.io") + requires("org.apache.commons.logging") + } + module("org.apache.pdfbox:pdfbox-io", "org.apache.pdfbox.io") + module("org.apache.velocity:velocity-engine-core", "org.apache.velocity.engine.core") + module("org.eclipse.jgit:org.eclipse.jgit", "org.eclipse.jgit") + module("org.fxmisc.undo:undofx", "org.fxmisc.undo") + module("org.fxmisc.wellbehaved:wellbehavedfx", "org.fxmisc.wellbehaved") { + exportAllPackages() + requires("javafx.graphics") + } + module("org.javassist:javassist", "org.javassist") + module("org.jbibtex:jbibtex", "org.jbibtex") { + exportAllPackages() + } + module("org.scala-lang:scala-library", "scala.library") + module("pt.davidafsilva.apple:jkeychain", "pt.davidafsilva.apple.jkeychain") + module("org.testfx:testfx-core", "org.testfx") { + patchRealModule() + exportAllPackages() + // Content based on https://github.com/TestFX/TestFX/commit/bf4a08aa82c008fdd3c296aaafee1d222f3824cb + requires("java.desktop") + requiresTransitive("javafx.controls") + requiresTransitive("org.hamcrest") + } + module("org.testfx:testfx-junit5", "org.testfx.junit5") { + patchRealModule() + exportAllPackages() + requires("org.junit.jupiter.api") + requiresTransitive("org.testfx") + } + + module("commons-fileupload:commons-fileupload", "commons.fileupload") + + module("org.xmlunit:xmlunit-core", "org.xmlunit") { + exportAllPackages() + requires("java.xml") + } + module("org.xmlunit:xmlunit-legacy", "org.custommonkey.xmlunit") { + exportAllPackages() + requires("java.xml") + } + + module("org.xmlunit:xmlunit-matchers", "org.xmlunit.matchers") { + exportAllPackages() + requires("java.logging") + requires("org.xmlunit") + requires("org.hamcrest") + } + module("org.xmlunit:xmlunit-placeholders", "org.xmlunit.placeholder") + + module("net.javacrumbs.json-unit:json-unit-core", "net.javacrumbs.jsonunit.core") + module("com.github.javaparser:javaparser-core", "com.github.javaparser.core") + module("com.github.javaparser:javaparser-symbol-solver-core", "com.github.javaparser.symbolsolver.core") + module("net.sf.jopt-simple:jopt-simple", "net.sf.jopt.simple") + + module("com.tngtech.archunit:archunit-junit5-api", "com.tngtech.archunit.junit5.api") + module("com.tngtech.archunit:archunit-junit5-engine", "com.tngtech.archunit.junit5.engine") + module("com.tngtech.archunit:archunit-junit5-engine-api", "com.tngtech.archunit.junit5.engineapi") + module("com.tngtech.archunit:archunit", "com.tngtech.archunit") { + exportAllPackages() + requires("java.logging") + requires("org.slf4j") + } + + module("org.glassfish.hk2.external:aopalliance-repackaged", "org.aopalliance") + module("org.glassfish.jersey.core:jersey-server", "org.glassfish.jersey.server") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + requires("jakarta.xml.bind") + requires("org.glassfish.jersey.hk2") + } + // module("org.glassfish.jersey.containers:jersey-container-servlet", "org.glassfish.jersey.servlet") + module("org.glassfish.jersey.inject:jersey-hk2", "org.glassfish.jersey.hk2") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + } + module("org.glassfish.jersey.core:jersey-client", "org.glassfish.jersey.client") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + } + module("org.glassfish.jersey.core:jersey-common", "org.glassfish.jersey.common") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + requires("java.xml") + } + module("org.glassfish.jersey.containers:jersey-container-grizzly2-http", "org.glassfish.jersey.grizzly2.http") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + requires("org.glassfish.grizzly") + requires("org.glassfish.grizzly.http") + } + module("org.glassfish.jersey.test-framework:jersey-test-framework-core", "org.glassfish.jersey.test.framework.core") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + } + module("org.glassfish.jersey.containers:jersey-container-grizzly2-servlet", "org.glassfish.jersey.container.grizzly2.servlet") { + // requires("org.glassfish.jersey.servlet") + } + module("org.glassfish.jersey.containers:jersey-container-servlet", "org.glassfish.jersey.container.servlet") { + exportAllPackages() + // requireAllDefinedDependencies() + requires("org.glassfish.jersey.container.servlet.core") + requires("jakarta.servlet.api") + } + module("jakarta.servlet:jakarta.servlet-api", "jakarta.servlet.api") { + patchRealModule() + exportAllPackages() + } + module("org.glassfish.jersey.containers:jersey-container-servlet-core", "org.glassfish.jersey.container.servlet.core") { + exportAllPackages() + requires("jakarta.servlet.api") + } + module("org.glassfish.jersey.media:jersey-media-jaxb", "org.glassfish.jersey.media.jaxb") { + requireAllDefinedDependencies() + requires("java.logging") + requires("java.xml") + requires("jakarta.xml.bind") + } + module("org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-grizzly2", "org.glassfish.jersey.test.provider.grizzly2") { + requireAllDefinedDependencies() + requires("java.logging") + } + module("org.glassfish.hk2:hk2-locator", "org.glassfish.hk2.locator") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + } + module("org.glassfish.hk2:hk2-api", "org.glassfish.hk2.api") { + exportAllPackages() + requireAllDefinedDependencies() + uses("org.glassfish.hk2.extension.ServiceLocatorGenerator") + } + module("org.glassfish.hk2:hk2-utils", "org.glassfish.hk2.utilities") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + } + module("org.glassfish.hk2:osgi-resource-locator", "org.glassfish.hk2.osgi.resource.locator") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + } + + module("com.github.sialcasa.mvvmFX:mvvmfx-validation", "de.saxsys.mvvmfx.validation") { + exportAllPackages() + requireAllDefinedDependencies() + requiresTransitive("javafx.base") + requiresTransitive("javafx.controls") + requiresTransitive("org.controlsfx.controls") + } + module("de.saxsys:mvvmfx", "de.saxsys.mvvmfx") { + exportAllPackages() + requireAllDefinedDependencies() + requiresTransitive("javafx.base") + } + module("de.saxsys:mvvmfx-validation", "de.saxsys.mvvmfx.validation") { + exportAllPackages() + requireAllDefinedDependencies() + requiresTransitive("javafx.base") + } + module("org.reactfx:reactfx", "org.reactfx") { + exportAllPackages() + requireAllDefinedDependencies() + requiresTransitive("javafx.controls") + } + module("org.fxmisc.flowless:flowless", "org.fxmisc.flowless") { + exportAllPackages() + requireAllDefinedDependencies() + requiresTransitive("javafx.controls") + } + module("org.fxmisc.richtext:richtextfx", "org.fxmisc.richtext") { + exportAllPackages() + requireAllDefinedDependencies() + requiresTransitive("javafx.graphics") + } + module("io.github.stefanbratanov:jvm-openai", "io.github.stefanbratanov.jvm.openai") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.net.http") + } + module("io.zonky.test:embedded-postgres", "io.zonky.test.embedded.postgres") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.sql") + } + module("org.postgresql:postgresql", "org.postgresql.jdbc") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.management") + requires("java.naming") + requires("java.sql") + } + module("org.apache.pdfbox:pdfbox", "org.apache.pdfbox") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.desktop") + } + module("org.apache.pdfbox:xmpbox", "org.apache.xmpbox") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.xml") + } + module("com.squareup.okio:okio-jvm", "okio") { + exportAllPackages() + requireAllDefinedDependencies() + requires("java.logging") + } module("org.openjfx:javafx-base", "javafx.base") { - overrideModuleName() patchRealModule() // jabgui requires at least "javafx.collections" exportAllPackages() @@ -61,21 +431,22 @@ extraJavaModuleInfo { patchRealModule() exportAllPackages() - requiresTransitive("javafx.base") requiresTransitive("javafx.graphics") requiresTransitive("java.desktop") } - // required for testing + // Required for fxml loading (for localization test) module("org.openjfx:javafx-graphics", "javafx.graphics") { patchRealModule() - exportAllPackages() + exportAllPackages() // required for testfx requiresTransitive("javafx.base") requiresTransitive("java.desktop") requiresTransitive("jdk.unsupported") } + module("org.openjfx:jdk-jsobject", "jdk.jsobjectEmpty") + module("org.controlsfx:controlsfx", "org.controlsfx.controls") { patchRealModule() @@ -89,9 +460,8 @@ extraJavaModuleInfo { exports("org.controlsfx.validation") exports("org.controlsfx.validation.decoration") - requires("javafx.base") requires("javafx.controls") - requires("javafx.graphics") + requiresTransitive("javafx.graphics") } module("org.openjfx:javafx-controls", "javafx.controls") { @@ -109,18 +479,28 @@ extraJavaModuleInfo { exports("com.sun.javafx.scene.control") } + module("org.hamcrest:hamcrest", "org.hamcrest") { + exportAllPackages() + } + + module("org.mockito:mockito-core", "org.mockito") { + preserveExisting() + requires("java.prefs") + } + // Workaround for https://github.com/wiremock/wiremock/issues/2149 module("org.wiremock:wiremock", "wiremock") { - overrideModuleName() - patchRealModule() exportAllPackages() - requires("wiremock.slf4j.spi.shim") + requires("org.apache.httpcomponents.client5.httpclient5") requires("com.fasterxml.jackson.core") requires("com.fasterxml.jackson.databind") requires("com.fasterxml.jackson.datatype.jsr310") requires("com.google.common") requires("commons.fileupload") + requires("java.xml") + requires("json.path") + requires("org.custommonkey.xmlunit") requires("org.eclipse.jetty.server") requires("org.eclipse.jetty.servlet") requires("org.eclipse.jetty.servlets") @@ -131,10 +511,9 @@ extraJavaModuleInfo { requires("org.eclipse.jetty.alpn.java.server") requires("org.eclipse.jetty.alpn.java.client") requires("org.eclipse.jetty.alpn.client") - requires("java.xml") - requires("org.custommonkey.xmlunit") requires("org.slf4j") requires("org.xmlunit") + requires("wiremock.slf4j.spi.shim") uses("com.github.tomakehurst.wiremock.extension.Extension") @@ -145,4 +524,32 @@ extraJavaModuleInfo { // Required to provide package "wiremock.org.slf4j.helpers" mergeJar("com.github.koppor:wiremock-slf4j-shim") } + module("com.github.koppor:wiremock-slf4j-shim", "wiremock.slf4j.shim") { + patchRealModule() + exportAllPackages() + } + module("com.github.koppor:wiremock-slf4j-spi-shim", "wiremock.slf4j.spi.shim") { + patchRealModule() + exportAllPackages() + } + module("org.objenesis:objenesis", "org.objenesis") { + exportAllPackages() + requireAllDefinedDependencies() + } + module("com.jayway.jsonpath:json-path", "json.path") { + exportAllPackages() + requireAllDefinedDependencies() + requires("com.fasterxml.jackson.databind") + } + module("net.minidev:json-smart", "json.smart") + module("net.minidev:accessors-smart", "accessors.smart") + module("org.ow2.asm:asm", "org.objectweb.asm") { + preserveExisting() + } + + module("org.openjdk.jmh:jmh-core", "jmh.core") + module("org.openjdk.jmh:jmh-generator-asm", "jmh.generator.asm") + module("org.openjdk.jmh:jmh-generator-bytecode", "jmh.generator.bytecode") + module("org.openjdk.jmh:jmh-generator-reflection", "jmh.generator.reflection") + module("org.apache.commons:commons-math3", "org.apache.commons.math3") } diff --git a/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts b/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts index fc2fcc3a232..3895ade1b57 100644 --- a/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts +++ b/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts @@ -1,30 +1,20 @@ -import org.gradle.internal.os.OperatingSystem - plugins { id("org.gradlex.java-module-packaging") } -// TODO jjohannes: OS detection should be part of packaging plugin -// https://github.com/gradlex-org/java-module-packaging/issues/51 -// the result name must equal the name of one of the targets below in javaModulePackaging -val os = OperatingSystem.current() -val osTarget = when { - os.isMacOsX -> { - val osVersion = System.getProperty("os.version") - val arch = System.getProperty("os.arch") - if (arch.contains("aarch")) "macos-14" else "macos-13" - } - os.isLinux -> { - val arch = System.getProperty("os.arch") - if (arch.contains("aarch")) "ubuntu-22.04-arm" else "ubuntu-22.04" - } - os.isWindows -> "windows-2022" - else -> error("Unsupported OS") -} - // Source: https://github.com/jjohannes/java-module-system/blob/main/gradle/plugins/src/main/kotlin/targets.gradle.kts // Configure variants for OS. Target name can be any string, but should match the name used in GitHub actions. javaModulePackaging { + // Configuration shared by all targets and applications + vendor = "JabRef" + jlinkOptions.addAll( + "--ignore-signing-information", + "--compress", "zip-6", + "--no-header-files", + "--no-man-pages", + "--bind-services", + ) + target("ubuntu-22.04") { operatingSystem = OperatingSystemFamily.LINUX architecture = MachineArchitecture.X86_64 @@ -39,16 +29,17 @@ javaModulePackaging { operatingSystem = OperatingSystemFamily.MACOS architecture = MachineArchitecture.X86_64 packageTypes = listOf("dmg") + singleStepPackaging = true } target("macos-14") { operatingSystem = OperatingSystemFamily.MACOS architecture = MachineArchitecture.ARM64 packageTypes = listOf("dmg") + singleStepPackaging = true } target("windows-2022") { operatingSystem = OperatingSystemFamily.WINDOWS architecture = MachineArchitecture.X86_64 - packageTypes = listOf("exe") + packageTypes = listOf("msi") } - primaryTarget(target(osTarget)) } diff --git a/build-logic/src/main/kotlin/org.jabref.gradle.build.settings.gradle.kts b/build-logic/src/main/kotlin/org.jabref.gradle.build.settings.gradle.kts new file mode 100644 index 00000000000..6acdc215691 --- /dev/null +++ b/build-logic/src/main/kotlin/org.jabref.gradle.build.settings.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") + id("org.gradlex.java-module-dependencies") +} + +// https://github.com/gradlex-org/java-module-dependencies#plugin-dependency +includeBuild(".") diff --git a/jabgui/build.gradle.kts b/jabgui/build.gradle.kts index 6c7d221d506..f26aa4c2f37 100644 --- a/jabgui/build.gradle.kts +++ b/jabgui/build.gradle.kts @@ -6,24 +6,28 @@ plugins { // Do not activate; causes issues with the modularity plugin (no tests found etc) // id("com.redock.classpathtofile") version "0.1.0" - - id("org.beryx.jlink") version "3.1.1" } group = "org.jabref" version = project.findProperty("projVersion") ?: "100.0.0" +// See https://javadoc.io/doc/org.mockito/mockito-core/latest/org.mockito/org/mockito/Mockito.html#0.3 +val mockitoAgent = configurations.create("mockitoAgent") + dependencies { implementation(project(":jablib")) - - implementation("org.openjfx:javafx-base") - implementation("org.openjfx:javafx-controls") - implementation("org.openjfx:javafx-fxml") + // Following already provided by jablib + // implementation("org.openjfx:javafx-base") + // implementation("org.openjfx:javafx-controls") + // implementation("org.openjfx:javafx-fxml") // implementation("org.openjfx:javafx-graphics") - implementation("org.openjfx:javafx-graphics") + implementation("org.openjfx:javafx-swing") implementation("org.openjfx:javafx-web") + // From JavaFX25 onwards + implementation("org.openjfx:jdk-jsobject:25-ea+21") + implementation("org.slf4j:slf4j-api") implementation("org.tinylog:tinylog-api") implementation("org.tinylog:slf4j-tinylog") @@ -104,319 +108,114 @@ dependencies { testImplementation("org.testfx:testfx-junit5") testImplementation("org.mockito:mockito-core") + mockitoAgent("org.mockito:mockito-core:5.18.0") { isTransitive = false } testImplementation("net.bytebuddy:byte-buddy") - testImplementation("org.wiremock:wiremock") + testImplementation("org.hamcrest:hamcrest") + + testImplementation("org.wiremock:wiremock") { + exclude(group = "net.sf.jopt-simple", module = "jopt-simple") + } testImplementation("com.github.javaparser:javaparser-symbol-solver-core") + testImplementation("org.ow2.asm:asm") } application { mainClass.set("org.jabref.Launcher") mainModule.set("org.jabref") - applicationDefaultJvmArgs = listOf( - // On a change here, also adapt - // 1. "run > moduleOptions" - // 2. "binaries.yml" (macOS part) - - // Note that the arguments are cleared for the "run" task to avoid messages like "WARNING: Unknown module: org.jabref.merged.module specified to --add-exports" - - // Enable JEP 450: Compact Object Headers - "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCompactObjectHeaders", - - "-XX:+UseZGC", "-XX:+ZUncommit", - "-XX:+UseStringDeduplication", - - // Fix for https://github.com/JabRef/jabref/issues/11225 on linux - "--add-opens=javafx.controls/javafx.scene.control=org.jabref", - "--add-exports=javafx.base/com.sun.javafx.event=org.jabref", - "--add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref", - "--add-opens=javafx.graphics/javafx.scene=org.jabref", - "--add-opens=javafx.controls/javafx.scene.control=org.jabref", - "--add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref", - - "--add-opens=javafx.base/javafx.collections=org.jabref", - "--add-opens=javafx.base/javafx.collections.transformation=org.jabref", - - "--enable-native-access=ai.djl.tokenizers,ai.djl.pytorch_engine,com.sun.jna,javafx.graphics,javafx.media,javafx.web,org.apache.lucene.core" + application.applicationDefaultJvmArgs = listOf( + "--enable-native-access=ai.djl.tokenizers,ai.djl.pytorch_engine,com.sun.jna,javafx.graphics,javafx.media,javafx.web,org.apache.lucene.core", + "--add-opens", "java.base/java.nio=org.apache.pdfbox.io", + // https://github.com/uncomplicate/neanderthal/issues/55 + "--add-opens", "java.base/jdk.internal.ref=org.apache.pdfbox.io", + "--add-modules", "jdk.incubator.vector" ) } -/* -jacoco { - toolVersion = "0.8.13" -} -*/ - tasks.named("run") { // "assert" statements in the code should activated when running using gradle enableAssertions = true - - doFirst { - // Clear the default JVM arguments to avoid warnings - // application.applicationDefaultJvmArgs = emptyList() - application.applicationDefaultJvmArgs = - listOf( - "--enable-native-access=ai.djl.tokenizers,ai.djl.pytorch_engine,com.sun.jna,javafx.graphics,javafx.media,javafx.web,org.apache.lucene.core" - ) - } -} - -tasks.named("jpackage") { - dependsOn("deleteInstallerTemp") -} - -tasks.named("jlinkZip") { - dependsOn("jpackage") -} - -tasks.register("deleteInstallerTemp") { - delete(file("${layout.buildDirectory.get()}/installer")) } -jlink { - // https://github.com/beryx/badass-jlink-plugin/issues/61#issuecomment-504640018 - addExtraDependencies( - "javafx" - ) - - // We keep debug statements - otherwise "--strip-debug" would be included - addOptions( - "--compress", - "zip-6", - "--no-header-files", - "--no-man-pages", - "--bind-services", - "--add-modules", "jdk.incubator.vector" - ) - - launcher { - name = "JabRef" - jvmArgs = listOf( - // Fix for https://github.com/JabRef/jabref/issues/11188 - "--add-exports=javafx.base/com.sun.javafx.event=org.jabref.merged.module", - "--add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module", - - // Fix for https://github.com/JabRef/jabref/issues/11198 - "--add-opens=javafx.graphics/javafx.scene=org.jabref.merged.module", - "--add-opens=javafx.controls/javafx.scene.control=org.jabref.merged.module", - "--add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module", - // fix for https://github.com/JabRef/jabref/issues/11426 - "--add-opens=javafx.controls/javafx.scene.control.skin=org.jabref.merged.module", - - "--enable-native-access=org.jabref.merged.module" +// Below should eventually replace the 'jlink {}' and doLast-copy configurations above +javaModulePackaging { + applicationName = "JabRef" + jpackageResources = layout.projectDirectory.dir("buildres") + verbose = true + addModules.add("jdk.incubator.vector") + targetsWithOs("windows") { + options.addAll( + "--win-upgrade-uuid", "d636b4ee-6f10-451e-bf57-c89656780e36", + "--win-dir-chooser", + "--win-shortcut", + "--win-menu", + "--win-menu-group", "JabRef", + "--license-file", "$projectDir/buildres/LICENSE_with_Privacy.md", + "--file-associations", "$projectDir/buildres/windows/bibtexAssociations.properties" ) + targetResources.from(layout.projectDirectory.dir("buildres/windows").asFileTree.matching { + include("jabref-firefox.json") + include("jabref-chrome.json") + include("JabRefHost.bat") + include("JabRefHost.ps1") + }) } - - // TODO: Remove as soon as dependencies are fixed (upstream) - forceMerge( - "controlsfx", - "bcprov", - "stax" - ) - - mergedModule { - requires("com.google.gson") - requires("com.fasterxml.jackson.annotation") - requires("com.fasterxml.jackson.databind") - requires("com.fasterxml.jackson.core") - requires("com.fasterxml.jackson.datatype.jdk8") - requires("java.compiler") - requires("java.datatransfer") - requires("java.desktop") - requires("java.logging") - requires("java.management") - requires("java.naming") - requires("java.net.http") - requires("java.rmi") - requires("java.scripting") - requires("java.security.jgss") - requires("java.security.sasl") - requires("java.sql") - requires("java.sql.rowset") - requires("java.transaction.xa") - requires("java.xml") - requires("javafx.base") - requires("javafx.controls") - requires("javafx.fxml") - requires("javafx.graphics") - requires("javafx.media") - requires("javafx.swing") - requires("jdk.security.jgss") - requires("jdk.unsupported") - requires("jdk.unsupported.desktop") - requires("jdk.xml.dom") - requires("org.apache.commons.lang3") - requires("org.apache.commons.logging") - requires("org.apache.commons.text") - requires("org.apache.commons.codec") - requires("org.apache.commons.io") - requires("org.apache.commons.compress") - requires("org.freedesktop.dbus") - requires("org.jsoup") - requires("org.slf4j") - requires("org.tukaani.xz"); - - uses("ai.djl.engine.EngineProvider") - uses("ai.djl.repository.RepositoryFactory") - uses("ai.djl.repository.zoo.ZooProvider") - uses("dev.langchain4j.spi.prompt.PromptTemplateFactory") - uses("kong.unirest.core.json.JsonEngine") - uses("org.eclipse.jgit.lib.Signer") - uses("org.eclipse.jgit.transport.SshSessionFactory") - uses("org.postgresql.shaded.com.ongres.stringprep.Profile") - - provides("java.sql.Driver").with( - "org.postgresql.Driver") - provides("java.security.Provider").with( - "org.bouncycastle.jce.provider.BouncyCastleProvider", - "org.bouncycastle.pqc.jcajce.provider.BouncyCastlePQCProvider") - provides("kong.unirest.core.json.JsonEngine").with( - "kong.unirest.modules.gson.GsonEngine") - provides("ai.djl.repository.zoo.ZooProvider").with( - "ai.djl.engine.rust.zoo.RsZooProvider", - "ai.djl.huggingface.zoo.HfZooProvider", - "ai.djl.pytorch.zoo.PtZooProvider", - "ai.djl.repository.zoo.DefaultZooProvider") - provides("ai.djl.engine.EngineProvider").with( - "ai.djl.engine.rust.RsEngineProvider", - "ai.djl.pytorch.engine.PtEngineProvider") - } - - // This tasks reads resources from src/main/resourcesPackage/$OS - jpackage { - outputDir = - "distribution" - - if (OperatingSystem.current().isWindows) { - // This requires WiX to be installed: https://github.com/wixtoolset/wix3/releases - installerType = "msi" - - imageOptions.addAll( - listOf( - "--icon", "${projectDir}/src/main/resources/icons/jabref.ico" - ) - ) - - installerOptions.addAll( - listOf( - "--vendor", "JabRef", - "--app-version", "$version", - "--verbose", - "--win-upgrade-uuid", "d636b4ee-6f10-451e-bf57-c89656780e36", - "--win-dir-chooser", - "--win-shortcut", - "--win-menu", - "--win-menu-group", "JabRef", - "--temp", "${layout.buildDirectory.get()}/installer", - "--resource-dir", "$projectDir/buildres/windows", - "--license-file", "$projectDir/buildres/LICENSE_with_Privacy.md", - "--file-associations", "$projectDir/buildres/windows/bibtexAssociations.properties" - ) - ) - } else if (OperatingSystem.current().isLinux) { - imageOptions.addAll( - listOf( - "--icon", "$projectDir/src/main/resources/icons/JabRef-linux-icon-64.png", - "--app-version", "$version" - ) - ) - - installerOptions.addAll( - listOf( - "--verbose", - "--vendor", "JabRef", - "--app-version", "$version", - // "--temp", "$buildDir/installer", - "--resource-dir", "$projectDir/buildres/linux", - "--linux-menu-group", "Office;", - "--linux-rpm-license-type", "MIT", - // "--license-file", "$projectDir/LICENSE.md", - "--description", "JabRef is an open source bibliography reference manager. Simplifies reference management and literature organization for academic researchers by leveraging BibTeX, native file format for LaTeX.", - "--linux-shortcut", - "--file-associations", "$projectDir/buildres/linux/bibtexAssociations.properties" - ) - ) - } else if (OperatingSystem.current().isMacOsX) { - imageOptions.addAll( - listOf( - "--icon", "$projectDir/src/main/resources/icons/jabref.icns", - "--resource-dir", "$projectDir/buildres/mac" - ) - ) - - skipInstaller = true - - installerOptions.addAll( - listOf( - "--verbose", - "--vendor", "JabRef", - "--mac-package-identifier", "JabRef", - "--mac-package-name", "JabRef", - "--app-version", "$version", - "--file-associations", "$projectDir/buildres/mac/bibtexAssociations.properties", - "--resource-dir", "$projectDir/buildres/mac" - ) - ) - } - } -} - -if (OperatingSystem.current().isWindows) { - tasks.named("jpackageImage").configure { - doLast { - copy { - from(file("$projectDir/buildres/windows")) { - include( - "jabref-firefox.json", - "jabref-chrome.json", - "JabRefHost.bat", - "JabRefHost.ps1" - ) - } - into(file("${layout.buildDirectory.get()}/distribution/JabRef")) - } - } - } -} else if (OperatingSystem.current().isLinux) { - tasks.named("jpackageImage").configure { - doLast { - copy { - from(file("$projectDir/buildres/linux")) { - include("native-messaging-host/**", "jabrefHost.py") - } - into(file("${layout.buildDirectory.get()}/distribution/JabRef/lib")) - } - } + targetsWithOs("linux") { + options.addAll( + "--linux-menu-group", "Office;", + "--linux-rpm-license-type", "MIT", + "--description", "JabRef is an open source bibliography reference manager. Simplifies reference management and literature organization for academic researchers by leveraging BibTeX, native file format for LaTeX.", + "--linux-shortcut", + "--file-associations", "$projectDir/buildres/linux/bibtexAssociations.properties" + ) + targetResources.from(layout.projectDirectory.dir("buildres/linux").asFileTree.matching { + include("native-messaging-host/**") + include("jabrefHost.py") + }) } -} else if (OperatingSystem.current().isMacOsX) { - tasks.named("jpackageImage").configure { - doLast { - copy { - from(file("$projectDir/buildres/mac")) { - include("native-messaging-host/**", "jabrefHost.py") - } - into(file("${layout.buildDirectory.get()}/distribution/JabRef.app/Contents/Resources")) - } - } + targetsWithOs("macos") { + options.addAll( + "--mac-package-identifier", "JabRef", + "--mac-package-name", "JabRef", + "--file-associations", "$projectDir/buildres/macos/bibtexAssociations.properties" + ) + targetResources.from(layout.projectDirectory.dir("buildres/macos").asFileTree.matching { + include("Resources/**") + }) } } javaModuleTesting.whitebox(testing.suites["test"]) { requires.add("org.jabref.testsupport") + // Not sure why there is no dependency for jabgui normal running for this dependency + // requires.add("javafx.graphics") + + requires.add("com.github.javaparser.core") requires.add("org.junit.jupiter.api") requires.add("org.junit.jupiter.params") requires.add("org.mockito") + + requires.add("org.testfx") + requires.add("org.testfx.junit5") + requires.add("wiremock") requires.add("wiremock.slf4j.spi.shim") } tasks.test { jvmArgs = listOf( + "-javaagent:${mockitoAgent.asPath}", + + // Source: https://github.com/TestFX/TestFX/issues/638#issuecomment-433744765 "--add-opens", "javafx.graphics/com.sun.javafx.application=org.testfx", - "--add-reads", "org.mockito=java.prefs", - "--add-reads", "org.jabref=wiremock" + + "--add-opens", "java.base/jdk.internal.ref=org.apache.pdfbox.io", + "--add-opens", "java.base/java.nio=org.apache.pdfbox.io" + + // "--add-reads", "org.mockito=java.prefs", + // "--add-reads", "org.jabref=wiremock" ) } diff --git a/jabgui/buildres/mac/Info-lite.plist.template b/jabgui/buildres/macos/Info-lite.plist.template similarity index 100% rename from jabgui/buildres/mac/Info-lite.plist.template rename to jabgui/buildres/macos/Info-lite.plist.template diff --git a/jabgui/buildres/mac/Info.plist b/jabgui/buildres/macos/Info.plist similarity index 100% rename from jabgui/buildres/mac/Info.plist rename to jabgui/buildres/macos/Info.plist diff --git a/jabgui/buildres/mac/Info.plist.template b/jabgui/buildres/macos/Info.plist.template similarity index 100% rename from jabgui/buildres/mac/Info.plist.template rename to jabgui/buildres/macos/Info.plist.template diff --git a/jabgui/buildres/mac/JabRef-background-darkAqua.png b/jabgui/buildres/macos/JabRef-background-darkAqua.png similarity index 100% rename from jabgui/buildres/mac/JabRef-background-darkAqua.png rename to jabgui/buildres/macos/JabRef-background-darkAqua.png diff --git a/jabgui/buildres/mac/JabRef-background.png b/jabgui/buildres/macos/JabRef-background.png similarity index 100% rename from jabgui/buildres/mac/JabRef-background.png rename to jabgui/buildres/macos/JabRef-background.png diff --git a/jabgui/buildres/mac/JabRef-background.tiff b/jabgui/buildres/macos/JabRef-background.tiff similarity index 100% rename from jabgui/buildres/mac/JabRef-background.tiff rename to jabgui/buildres/macos/JabRef-background.tiff diff --git a/jabgui/buildres/mac/JabRef-dmg-setup.scpt b/jabgui/buildres/macos/JabRef-dmg-setup.scpt similarity index 100% rename from jabgui/buildres/mac/JabRef-dmg-setup.scpt rename to jabgui/buildres/macos/JabRef-dmg-setup.scpt diff --git a/jabgui/buildres/mac/Jabref-volume.icns b/jabgui/buildres/macos/Jabref-volume.icns similarity index 100% rename from jabgui/buildres/mac/Jabref-volume.icns rename to jabgui/buildres/macos/Jabref-volume.icns diff --git a/jabgui/buildres/mac/README.md b/jabgui/buildres/macos/README.md similarity index 100% rename from jabgui/buildres/mac/README.md rename to jabgui/buildres/macos/README.md diff --git a/jabgui/buildres/mac/Resources/jabrefHost.py b/jabgui/buildres/macos/Resources/jabrefHost.py similarity index 100% rename from jabgui/buildres/mac/Resources/jabrefHost.py rename to jabgui/buildres/macos/Resources/jabrefHost.py diff --git a/jabgui/buildres/mac/Resources/native-messaging-host/chromium/bifehkofibaamoeaopjglfkddgkijdlh.json b/jabgui/buildres/macos/Resources/native-messaging-host/chromium/bifehkofibaamoeaopjglfkddgkijdlh.json similarity index 100% rename from jabgui/buildres/mac/Resources/native-messaging-host/chromium/bifehkofibaamoeaopjglfkddgkijdlh.json rename to jabgui/buildres/macos/Resources/native-messaging-host/chromium/bifehkofibaamoeaopjglfkddgkijdlh.json diff --git a/jabgui/buildres/mac/Resources/native-messaging-host/chromium/org.jabref.jabref.json b/jabgui/buildres/macos/Resources/native-messaging-host/chromium/org.jabref.jabref.json similarity index 100% rename from jabgui/buildres/mac/Resources/native-messaging-host/chromium/org.jabref.jabref.json rename to jabgui/buildres/macos/Resources/native-messaging-host/chromium/org.jabref.jabref.json diff --git a/jabgui/buildres/mac/Resources/native-messaging-host/firefox/org.jabref.jabref.json b/jabgui/buildres/macos/Resources/native-messaging-host/firefox/org.jabref.jabref.json similarity index 100% rename from jabgui/buildres/mac/Resources/native-messaging-host/firefox/org.jabref.jabref.json rename to jabgui/buildres/macos/Resources/native-messaging-host/firefox/org.jabref.jabref.json diff --git a/jabgui/buildres/mac/Runtime-Info.plist b/jabgui/buildres/macos/Runtime-Info.plist similarity index 100% rename from jabgui/buildres/mac/Runtime-Info.plist rename to jabgui/buildres/macos/Runtime-Info.plist diff --git a/jabgui/buildres/mac/Runtime-Info.plist.template b/jabgui/buildres/macos/Runtime-Info.plist.template similarity index 100% rename from jabgui/buildres/mac/Runtime-Info.plist.template rename to jabgui/buildres/macos/Runtime-Info.plist.template diff --git a/jabgui/buildres/mac/bibtexAssociations.properties b/jabgui/buildres/macos/bibtexAssociations.properties similarity index 100% rename from jabgui/buildres/mac/bibtexAssociations.properties rename to jabgui/buildres/macos/bibtexAssociations.properties diff --git a/jabgui/buildres/mac/info-lite.plist b/jabgui/buildres/macos/info-lite.plist similarity index 100% rename from jabgui/buildres/mac/info-lite.plist rename to jabgui/buildres/macos/info-lite.plist diff --git a/jabgui/buildres/mac/jabref.entitlements b/jabgui/buildres/macos/jabref.entitlements similarity index 100% rename from jabgui/buildres/mac/jabref.entitlements rename to jabgui/buildres/macos/jabref.entitlements diff --git a/jabgui/buildres/mac/launcher.icns b/jabgui/buildres/macos/jabref.icns similarity index 100% rename from jabgui/buildres/mac/launcher.icns rename to jabgui/buildres/macos/jabref.icns diff --git a/jabgui/buildres/macos/launcher.icns b/jabgui/buildres/macos/launcher.icns new file mode 100644 index 0000000000000000000000000000000000000000..e231e8d3bad459b6315da47b1932353d48efad5e GIT binary patch literal 257939 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

d?n&d~APA>6W^4Y8) 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ⅇP~<5`+%0lf6)o+~*}G4{VgnN*aGE~x_b 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 literal 0 HcmV?d00001 diff --git a/jabgui/src/main/java/module-info.java b/jabgui/src/main/java/module-info.java index 0a529f52082..9c7cf4505d8 100644 --- a/jabgui/src/main/java/module-info.java +++ b/jabgui/src/main/java/module-info.java @@ -44,7 +44,7 @@ provides org.kordamp.ikonli.IkonProvider with org.jabref.gui.icon.JabrefIconProvider; - requires reactfx; + requires org.reactfx; // endregion // region: Logging @@ -89,7 +89,7 @@ // region HTTP clients requires org.apache.httpcomponents.core5.httpcore5; requires org.jsoup; - requires unirest.java.core; + requires com.konghq.unirest.java.core; // requires unirest.modules.gson; // endregion @@ -128,13 +128,13 @@ // requires com.ibm.icu; // requires flexmark; - requires flexmark.html2md.converter; + requires com.vladsch.flexmark.html2md.converter; // requires flexmark.util.ast; // requires flexmark.util.data; // requires com.h2database.mvstore; - requires java.keyring; + requires com.github.java.keyring; // requires org.freedesktop.dbus; requires org.jooq.jool; @@ -145,7 +145,7 @@ // requires ai.djl.tokenizers; // requires jvm.openai; // requires langchain4j; - requires langchain4j.core; + requires dev.langchain4j.core; // requires langchain4j.google.ai.gemini; // requires langchain4j.hugging.face; // requires langchain4j.mistral.ai; diff --git a/jabkit/build.gradle.kts b/jabkit/build.gradle.kts index 905f2bd1a9c..f92a5cb2c7c 100644 --- a/jabkit/build.gradle.kts +++ b/jabkit/build.gradle.kts @@ -1,8 +1,6 @@ plugins { id("org.jabref.gradle.module") id("application") - - id("org.beryx.jlink") version "3.1.1" } group = "org.jabref.jabkit" @@ -60,12 +58,6 @@ javaModuleTesting.whitebox(testing.suites["test"]) { requires.add("org.mockito") } -/* -jacoco { - toolVersion = "0.8.13" -} -*/ - application { mainClass.set("org.jabref.JabKit") mainModule.set("org.jabref.jabkit") @@ -83,120 +75,18 @@ application { ) } -// This is more or less a clone of jabgui/build.gradle.kts -> jlink -jlink { - // https://github.com/beryx/badass-jlink-plugin/issues/61#issuecomment-504640018 - addExtraDependencies( - "javafx" - ) - - mergedModuleName = "jabkit.merged.module" - - // We keep debug statements - otherwise "--strip-debug" would be included - addOptions( - "--compress", - "zip-6", - "--no-header-files", - "--no-man-pages", - "--bind-services", - "--add-modules", "jdk.incubator.vector" - ) - - launcher { - name = "jabkit" - } - - // TODO: Remove as soon as dependencies are fixed (upstream) - forceMerge( - "bcprov", - "stax" - ) - - mergedModule { - requires("com.google.gson") - requires("com.fasterxml.jackson.annotation") - requires("com.fasterxml.jackson.databind") - requires("com.fasterxml.jackson.core") - requires("com.fasterxml.jackson.datatype.jdk8") - requires("java.compiler") - requires("java.datatransfer") - requires("java.desktop") - requires("java.logging") - requires("java.management") - requires("java.naming") - requires("java.net.http") - requires("java.rmi") - requires("java.scripting") - requires("java.security.jgss") - requires("java.security.sasl") - requires("java.sql") - requires("java.sql.rowset") - requires("java.transaction.xa") - requires("java.xml") - requires("javafx.base") - requires("javafx.controls") - requires("javafx.fxml") - requires("javafx.graphics") - requires("jdk.security.jgss") - requires("jdk.unsupported") - requires("jdk.unsupported.desktop") - requires("jdk.xml.dom") - requires("org.apache.commons.lang3") - requires("org.apache.commons.logging") - requires("org.apache.commons.text") - requires("org.apache.commons.codec") - requires("org.apache.commons.io") - requires("org.apache.commons.compress") - requires("org.freedesktop.dbus") - requires("org.jsoup") - requires("org.slf4j") - requires("org.tukaani.xz"); - uses("ai.djl.engine.EngineProvider") - uses("ai.djl.repository.RepositoryFactory") - uses("ai.djl.repository.zoo.ZooProvider") - uses("dev.langchain4j.spi.prompt.PromptTemplateFactory") - uses("kong.unirest.core.json.JsonEngine") - uses("org.eclipse.jgit.lib.Signer") - uses("org.eclipse.jgit.transport.SshSessionFactory") - uses("org.postgresql.shaded.com.ongres.stringprep.Profile") - provides("java.sql.Driver").with( - "org.postgresql.Driver") - provides("java.security.Provider").with( - "org.bouncycastle.jce.provider.BouncyCastleProvider", - "org.bouncycastle.pqc.jcajce.provider.BouncyCastlePQCProvider") - provides("kong.unirest.core.json.JsonEngine").with( - "kong.unirest.modules.gson.GsonEngine") - provides("ai.djl.repository.zoo.ZooProvider").with( - "ai.djl.engine.rust.zoo.RsZooProvider", - "ai.djl.huggingface.zoo.HfZooProvider", - "ai.djl.pytorch.zoo.PtZooProvider", - "ai.djl.repository.zoo.DefaultZooProvider") - provides("ai.djl.engine.EngineProvider").with( - "ai.djl.engine.rust.RsEngineProvider", - "ai.djl.pytorch.engine.PtEngineProvider") - +javaModulePackaging { + applicationName = "jabkit" + addModules.add("jdk.incubator.vector") + targetsWithOs("windows") { + // Error: Option [--win-console] is not valid with type [msi] + // options.addAll( + // "--win-console" + // ) } - jpackage { - outputDir = "distribution" - skipInstaller = true - - imageOptions.addAll(listOf( - "--java-options", "--enable-native-access=jabkit.merged.module")) - - // See https://docs.oracle.com/en/java/javase/24/docs/specs/man/jpackage.html#platform-dependent-options-for-creating-the-application-package for available options - if (org.gradle.internal.os.OperatingSystem.current().isWindows) { - imageOptions.addAll( - listOf( - "--win-console" - ) - ) - } else if (org.gradle.internal.os.OperatingSystem.current().isLinux) { - imageOptions.addAll( - listOf( - "--icon", "$projectDir/../jabgui/src/main/resources/icons/JabRef-linux-icon-64.png", - "--app-version", "$version" - ) - ) - } + targetsWithOs("linux") { + options.addAll( + "--icon", "$projectDir/../jabgui/src/main/resources/icons/JabRef-linux-icon-64.png", + ) } } diff --git a/jabkit/src/main/resourcesPackage/linux/.gitkeep b/jabkit/src/main/resourcesPackage/linux/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jabkit/src/main/resourcesPackage/macos/.gitkeep b/jabkit/src/main/resourcesPackage/macos/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jabkit/src/main/resourcesPackage/windows/.gitkeep b/jabkit/src/main/resourcesPackage/windows/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jablib/build.gradle.kts b/jablib/build.gradle.kts index 8cbd4db6a53..85b7670acf9 100644 --- a/jablib/build.gradle.kts +++ b/jablib/build.gradle.kts @@ -42,13 +42,12 @@ tasks.withType().configureEach dependsOn(tasks.withType()) } +// See https://javadoc.io/doc/org.mockito/mockito-core/latest/org.mockito/org/mockito/Mockito.html#0.3 +val mockitoAgent = configurations.create("mockitoAgent") + dependencies { implementation("org.openjfx:javafx-base") - // Required by afterburner.fx - implementation("org.openjfx:javafx-controls") - implementation("org.openjfx:javafx-fxml") - implementation("org.openjfx:javafx-graphics") implementation("com.ibm.icu:icu4j") // Fix "error: module not found: javafx.controls" during compilation @@ -58,6 +57,9 @@ dependencies { // exclusions are not supported implementation("org.jabref:afterburner.fx") + // Required by afterburner.fx + implementation("org.openjfx:javafx-fxml") + implementation("org.jabref:easybind") implementation ("org.apache.pdfbox:pdfbox") @@ -96,6 +98,8 @@ dependencies { implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + // TODO: Somwewhere we get a warning: unknown enum constant Id.CLASS reason: class file for com.fasterxml.jackson.annotation.JsonTypeInfo$Id not found + // implementation("com.fasterxml.jackson.core:jackson-annotations:2.19.1") implementation("com.fasterxml:aalto-xml") @@ -193,16 +197,22 @@ dependencies { testImplementation("org.junit.platform:junit-platform-launcher") testImplementation("org.mockito:mockito-core") + // TODO: Use versions of versions/build.gradle.kts + mockitoAgent("org.mockito:mockito-core:5.18.0") { isTransitive = false } testImplementation("net.bytebuddy:byte-buddy") testImplementation("org.xmlunit:xmlunit-core") testImplementation("org.xmlunit:xmlunit-matchers") + testImplementation("org.junit.jupiter:junit-jupiter-api") testRuntimeOnly("com.tngtech.archunit:archunit-junit5-engine") testImplementation("com.tngtech.archunit:archunit-junit5-api") - testImplementation("org.hamcrest:hamcrest-library") + testImplementation("org.hamcrest:hamcrest") - testImplementation("org.wiremock:wiremock") + testImplementation("org.wiremock:wiremock") { + exclude(group = "net.sf.jopt-simple", module = "jopt-simple") + } + testImplementation("org.ow2.asm:asm") // Required for LocalizationConsistencyTest testImplementation("org.testfx:testfx-core") @@ -403,6 +413,11 @@ tasks.test { useJUnitPlatform { excludeTags("DatabaseTest", "FetcherTest") } + jvmArgs = listOf( + "-javaagent:${mockitoAgent.asPath}", + "--add-opens", "java.base/jdk.internal.ref=org.apache.pdfbox.io", + "--add-opens", "java.base/java.nio=org.apache.pdfbox.io" + ) } jmh { @@ -529,11 +544,15 @@ javaModuleTesting.whitebox(testing.suites["test"]) { requires.add("org.junit.jupiter.api") requires.add("org.junit.jupiter.params") requires.add("org.jabref.testsupport") + requires.add("org.hamcrest") requires.add("org.mockito") + + // Required for LocalizationConsistencyTest + requires.add("org.testfx.junit5") + // requires.add("org.assertj.core") + + requires.add("org.xmlunit") + requires.add("org.xmlunit.matchers") requires.add("wiremock") requires.add("wiremock.slf4j.spi.shim") - - // --add-reads - //reads.add("org.jabref.jablib=io.github.classgraph") - //reads.add("org.jabref.jablib=org.jabref.testsupport") } diff --git a/jablib/src/main/java/module-info.java b/jablib/src/main/java/module-info.java index 069a32f3e9e..426988c7bb1 100644 --- a/jablib/src/main/java/module-info.java +++ b/jablib/src/main/java/module-info.java @@ -152,12 +152,12 @@ requires jakarta.ws.rs; requires org.apache.httpcomponents.core5.httpcore5; requires org.jsoup; - requires unirest.java.core; - requires unirest.modules.gson; + requires com.konghq.unirest.java.core; + requires com.konghq.unirest.modules.gson; // endregion // region: SQL databases - requires embedded.postgres; + requires io.zonky.test.embedded.postgres; requires org.tukaani.xz; requires org.postgresql.jdbc; // endregion @@ -165,7 +165,7 @@ // region: Apache Commons and other (similar) helper libraries requires com.google.common; requires io.github.javadiffutils; - requires java.string.similarity; + requires info.debatty.java.string.similarity; requires org.apache.commons.compress; requires org.apache.commons.csv; requires org.apache.commons.io; @@ -176,27 +176,27 @@ // region: latex2unicode requires com.github.tomtung.latex2unicode; - requires fastparse; + requires com.lihaoyi.fastparse; requires scala.library; // endregion - requires jbibtex; - requires citeproc.java; + requires org.jbibtex; + requires de.undercouch.citeproc.java; - requires snuggletex.core; + requires de.rototor.snuggletex.core; requires org.apache.pdfbox; requires org.apache.xmpbox; requires com.ibm.icu; - requires flexmark; - requires flexmark.html2md.converter; - requires flexmark.util.ast; - requires flexmark.util.data; + requires com.vladsch.flexmark; + requires com.vladsch.flexmark.html2md.converter; + requires com.vladsch.flexmark.util.ast; + requires com.vladsch.flexmark.util.data; requires com.h2database.mvstore; - requires java.keyring; + requires com.github.java.keyring; requires org.freedesktop.dbus; requires org.jooq.jool; @@ -205,18 +205,18 @@ requires ai.djl.api; requires ai.djl.pytorch_model_zoo; requires ai.djl.tokenizers; - requires jvm.openai; - requires langchain4j; - requires langchain4j.core; - requires langchain4j.google.ai.gemini; - requires langchain4j.hugging.face; - requires langchain4j.mistral.ai; - requires langchain4j.open.ai; + requires io.github.stefanbratanov.jvm.openai; + requires dev.langchain4j; + requires dev.langchain4j.core; + requires dev.langchain4j.google.ai.gemini; + requires dev.langchain4j.hugging.face; + requires dev.langchain4j.mistral.ai; + requires dev.langchain4j.open.ai; uses ai.djl.engine.EngineProvider; uses ai.djl.repository.RepositoryFactory; uses ai.djl.repository.zoo.ZooProvider; uses dev.langchain4j.spi.prompt.PromptTemplateFactory; - requires velocity.engine.core; + requires org.apache.velocity.engine.core; // endregion // region: Lucene @@ -242,7 +242,7 @@ // region: other libraries (alphabetically) requires cuid; - requires dd.plist; + requires com.googlecode.dd.plist; requires io.github.adr; // required by okhttp and some AI library requires kotlin.stdlib; diff --git a/jablib/src/main/java/org/jabref/logic/preferences/PreviewPreferences.java b/jablib/src/main/java/org/jabref/logic/preferences/PreviewPreferences.java new file mode 100644 index 00000000000..f8ae32d569e --- /dev/null +++ b/jablib/src/main/java/org/jabref/logic/preferences/PreviewPreferences.java @@ -0,0 +1,127 @@ +package org.jabref.logic.preferences; + +import java.nio.file.Path; +import java.util.List; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +import org.jabref.logic.layout.TextBasedPreviewLayout; +import org.jabref.logic.preview.PreviewLayout; + +public class PreviewPreferences { + + private final ObservableList layoutCycle; + private final IntegerProperty layoutCyclePosition; + private final ObjectProperty customPreviewLayout; + private final StringProperty defaultCustomPreviewLayout; + private final BooleanProperty showPreviewAsExtraTab; + private final BooleanProperty showPreviewEntryTableTooltip; + private final ObservableList bstPreviewLayoutPaths; + + public PreviewPreferences(List layoutCycle, + int layoutCyclePosition, + TextBasedPreviewLayout customPreviewLayout, + String defaultCustomPreviewLayout, + boolean showPreviewAsExtraTab, + boolean showPreviewEntryTableTooltip, + List bstPreviewLayoutPaths) { + this.layoutCycle = FXCollections.observableArrayList(layoutCycle); + this.layoutCyclePosition = new SimpleIntegerProperty(layoutCyclePosition); + this.customPreviewLayout = new SimpleObjectProperty<>(customPreviewLayout); + this.defaultCustomPreviewLayout = new SimpleStringProperty(defaultCustomPreviewLayout); + this.showPreviewAsExtraTab = new SimpleBooleanProperty(showPreviewAsExtraTab); + this.showPreviewEntryTableTooltip = new SimpleBooleanProperty(showPreviewEntryTableTooltip); + this.bstPreviewLayoutPaths = FXCollections.observableList(bstPreviewLayoutPaths); + } + + public ObservableList getLayoutCycle() { + return layoutCycle; + } + + public int getLayoutCyclePosition() { + return layoutCyclePosition.getValue(); + } + + public IntegerProperty layoutCyclePositionProperty() { + return layoutCyclePosition; + } + + public void setLayoutCyclePosition(int position) { + if (layoutCycle.isEmpty()) { + this.layoutCyclePosition.setValue(0); + } else { + int previewCyclePosition = position; + while (previewCyclePosition < 0) { + previewCyclePosition += layoutCycle.size(); + } + this.layoutCyclePosition.setValue(previewCyclePosition % layoutCycle.size()); + } + } + + public PreviewLayout getSelectedPreviewLayout() { + if (layoutCycle.size() <= 0 + || layoutCyclePosition.getValue() < 0 + || layoutCyclePosition.getValue() >= layoutCycle.size()) { + return getCustomPreviewLayout(); + } else { + return layoutCycle.get(layoutCyclePosition.getValue()); + } + } + + public TextBasedPreviewLayout getCustomPreviewLayout() { + return customPreviewLayout.getValue(); + } + + public ObjectProperty customPreviewLayoutProperty() { + return customPreviewLayout; + } + + public void setCustomPreviewLayout(TextBasedPreviewLayout layout) { + this.customPreviewLayout.set(layout); + } + + public String getDefaultCustomPreviewLayout() { + return defaultCustomPreviewLayout.getValue(); + } + + public boolean shouldShowPreviewAsExtraTab() { + return showPreviewAsExtraTab.getValue(); + } + + public void setShowPreviewAsExtraTab(boolean showPreviewAsExtraTab) { + this.showPreviewAsExtraTab.set(showPreviewAsExtraTab); + } + + public BooleanProperty showPreviewAsExtraTabProperty() { + return showPreviewAsExtraTab; + } + + public boolean shouldShowPreviewEntryTableTooltip() { + return showPreviewEntryTableTooltip.getValue(); + } + + public void setShowPreviewEntryTableTooltip(boolean showPreviewEntryTableTooltip) { + this.showPreviewEntryTableTooltip.set(showPreviewEntryTableTooltip); + } + + public BooleanProperty showPreviewEntryTableTooltip() { + return showPreviewEntryTableTooltip; + } + + public ObservableList getBstPreviewLayoutPaths() { + return bstPreviewLayoutPaths; + } + + public void setBstPreviewLayoutPaths(List bstPreviewLayoutPaths) { + this.bstPreviewLayoutPaths.setAll(bstPreviewLayoutPaths); + } +} diff --git a/jabsrv-cli/build.gradle.kts b/jabsrv-cli/build.gradle.kts index 2ef336f4d09..275366c302d 100644 --- a/jabsrv-cli/build.gradle.kts +++ b/jabsrv-cli/build.gradle.kts @@ -3,8 +3,6 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat plugins { id("org.jabref.gradle.module") id("application") - - id("org.beryx.jlink") version "3.1.1" } application{ @@ -22,15 +20,13 @@ application{ ) } -val javafxVersion = "24.0.1" - dependencies { implementation(project(":jablib")) implementation(project(":jabsrv")) - implementation("org.openjfx:javafx-controls:${javafxVersion}") - implementation("org.openjfx:javafx-fxml:${javafxVersion}") - implementation ("org.openjfx:javafx-graphics:${javafxVersion}") + implementation("org.openjfx:javafx-controls") + implementation("org.openjfx:javafx-fxml") + implementation ("org.openjfx:javafx-graphics") implementation("org.slf4j:slf4j-api") implementation("org.tinylog:slf4j-tinylog") @@ -114,70 +110,18 @@ tasks.named("run") { } } -// This is more or less a clone of jabgui/build.gradle.kts -> jlink -jlink { - // https://github.com/beryx/badass-jlink-plugin/issues/61#issuecomment-504640018 - addExtraDependencies( - "javafx" - ) - - mergedModuleName = "jabsrv.merged.module" - - // We keep debug statements - otherwise "--strip-debug" would be included - addOptions( - "--compress", - "zip-6", - "--no-header-files", - "--no-man-pages", - "--bind-services" - ) - - launcher { - name = "jabsrv" - } - - // TODO: Remove as soon as dependencies are fixed (upstream) - forceMerge( - "bcprov", - "stax" - ) - - mergedModule { - uses("org.jvnet.hk2.external.generator.ServiceLocatorGeneratorImpl") - - uses("org.glassfish.jersey.internal.inject.InjectionManager") - uses("dev.langchain4j.spi.prompt.PromptTemplateFactory") - - excludeRequires("org.glassfish.hk2.locator") - excludeRequires("org.apache.logging.log4j") - excludeRequires("kotlin.stdlib") - +javaModulePackaging { + applicationName = "jabsrv" + vendor = "JabRef" + targetsWithOs("windows") { + // Error: Option [--win-console] is not valid with type [msi] + // options.addAll( + // "--win-console" + // ) } - jpackage { - outputDir = "distribution" - - imageOptions.addAll(listOf( - "--java-options", "--add-reads jabsrv.merged.module=jakarta.inject", - "--java-options", "--enable-native-access=jabsrv.merged.module")) - - // See https://docs.oracle.com/en/java/javase/24/docs/specs/man/jpackage.html#platform-dependent-options-for-creating-the-application-package for available options - if (org.gradle.internal.os.OperatingSystem.current().isWindows) { - imageOptions.addAll( - listOf( - "--win-console" - ) - ) - skipInstaller = true - } else if (org.gradle.internal.os.OperatingSystem.current().isLinux) { - imageOptions.addAll( - listOf( - "--icon", "$projectDir/../jabgui/src/main/resources/icons/JabRef-linux-icon-64.png", - "--app-version", "$version" - ) - ) - skipInstaller = true - } else if (org.gradle.internal.os.OperatingSystem.current().isMacOsX) { - skipInstaller = true - } + targetsWithOs("linux") { + options.addAll( + "--icon", "$projectDir/../jabgui/src/main/resources/icons/JabRef-linux-icon-64.png", + ) } } diff --git a/jabsrv-cli/src/main/java/module-info.java b/jabsrv-cli/src/main/java/module-info.java index 29a8d2f260a..be05a21664d 100644 --- a/jabsrv-cli/src/main/java/module-info.java +++ b/jabsrv-cli/src/main/java/module-info.java @@ -23,7 +23,7 @@ requires jakarta.validation; requires jakarta.ws.rs; - requires jersey.common; + requires org.glassfish.jersey.common; requires info.picocli; @@ -31,11 +31,11 @@ requires com.sun.jna; requires com.sun.jna.platform; - requires jbibtex; - requires citeproc.java; + requires org.jbibtex; + requires de.undercouch.citeproc.java; requires transitive org.jspecify; requires java.logging; - requires jersey.container.grizzly2.http; - requires jersey.server; + requires org.glassfish.jersey.grizzly2.http; + requires org.glassfish.jersey.server; } diff --git a/jabsrv/build.gradle.kts b/jabsrv/build.gradle.kts index 780b38f029c..cb374068aef 100644 --- a/jabsrv/build.gradle.kts +++ b/jabsrv/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { implementation("org.glassfish.jersey.containers:jersey-container-grizzly2-http") implementation("org.glassfish.grizzly:grizzly-http-server") implementation("org.glassfish.grizzly:grizzly-framework") + implementation("org.glassfish.jaxb:jaxb-runtime") testImplementation("org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-grizzly2") implementation("jakarta.validation:jakarta.validation-api") implementation("org.hibernate.validator:hibernate-validator") @@ -64,9 +65,10 @@ dependencies { } javaModuleTesting.whitebox(testing.suites["test"]) { + requires.add("jul.to.slf4j") + requires.add("org.glassfish.jersey.test.framework.core") requires.add("org.junit.jupiter.api") requires.add("org.mockito") - requires.add("jul.to.slf4j") } tasks.test { diff --git a/jabsrv/src/main/java/module-info.java b/jabsrv/src/main/java/module-info.java index 18b9baffaab..518a466ec12 100644 --- a/jabsrv/src/main/java/module-info.java +++ b/jabsrv/src/main/java/module-info.java @@ -31,17 +31,17 @@ requires jakarta.validation; requires jakarta.ws.rs; - requires jersey.common; + requires org.glassfish.jersey.common; requires net.harawata.appdirs; requires com.sun.jna; requires com.sun.jna.platform; - requires jbibtex; - requires citeproc.java; + requires org.jbibtex; + requires de.undercouch.citeproc.java; requires transitive org.jspecify; requires java.logging; - requires jersey.container.grizzly2.http; - requires jersey.server; + requires org.glassfish.jersey.grizzly2.http; + requires org.glassfish.jersey.server; } diff --git a/settings.gradle.kts b/settings.gradle.kts index 61d810ccdd9..b9aed07ba92 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,14 +19,14 @@ pluginManagement { maven("https://jitpack.io") } } - plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" + id("org.jabref.gradle.build") } rootProject.name = "JabRef" -include("jablib", "jabkit", "jabgui", "jabsrv", "jabsrv-cli", "test-support", "versions") - -// https://github.com/gradlex-org/java-module-dependencies#plugin-dependency -includeBuild(".") +javaModules { + directory(".") + versions("versions") + // include("jablib", "jabkit", "jabgui", "jabsrv", "jabsrv-cli", "test-support", "versions") +} diff --git a/versions/build.gradle.kts b/versions/build.gradle.kts index d4988ba0755..15e944a165f 100644 --- a/versions/build.gradle.kts +++ b/versions/build.gradle.kts @@ -51,6 +51,7 @@ dependencies.constraints { api("com.konghq:unirest-java-core:4.4.7") api("com.konghq:unirest-modules-gson:4.4.7") api("com.squareup.okhttp3:okhttp:4.12.0") + api("com.squareup.okio:okio-jvm:3.12.0") api("com.squareup.retrofit2:retrofit:3.0.0") api("com.tngtech.archunit:archunit-junit5-api:1.4.1") api("com.tngtech.archunit:archunit-junit5-engine:1.4.1") @@ -106,11 +107,12 @@ dependencies.constraints { api("org.glassfish.hk2:hk2-api:3.1.1") api("org.glassfish.hk2:hk2-locator:3.1.1") api("org.glassfish.hk2:hk2-utils:3.1.1") + api("org.glassfish.jaxb:jaxb-runtime:4.0.4") api("org.glassfish.jersey.containers:jersey-container-grizzly2-http:3.1.10") api("org.glassfish.jersey.core:jersey-server:3.1.10") api("org.glassfish.jersey.inject:jersey-hk2:3.1.10") api("org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-grizzly2:3.1.10") - api("org.hamcrest:hamcrest-library:3.0") + api("org.hamcrest:hamcrest:3.0") api("org.hibernate.validator:hibernate-validator:9.0.1.Final") api("org.jabref:afterburner.fx:2.0.0") api("org.jabref:easybind:2.2.1-SNAPSHOT") @@ -128,16 +130,17 @@ dependencies.constraints { api("org.libreoffice:unoloader:24.8.4") api("org.mockito:mockito-core:5.18.0") api("org.postgresql:postgresql:42.7.5") + api("org.ow2.asm:asm:9.6") api("org.slf4j:jul-to-slf4j:2.0.17") api("org.slf4j:slf4j-api:2.0.17") - api("org.testfx:testfx-core:4.0.16-alpha") - api("org.testfx:testfx-junit5:4.0.16-alpha") + api("org.testfx:testfx-core:4.0.18") + api("org.testfx:testfx-junit5:4.0.18") api("org.tinylog:slf4j-tinylog:2.7.0") api("org.tinylog:tinylog-api:2.7.0") api("org.tinylog:tinylog-impl:2.7.0") api("org.wiremock:wiremock:3.13.0") - api("org.xmlunit:xmlunit-core:2.10.2") - api("org.xmlunit:xmlunit-matchers:2.10.2") + api("org.xmlunit:xmlunit-core:2.10.3") + api("org.xmlunit:xmlunit-matchers:2.10.3") api("org.yaml:snakeyaml:2.4") api("tech.units:indriya:2.2.3") } From a74df8d0de04cf0952d01adbc5affd14a089ec64 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 24 Jun 2025 17:20:50 +0200 Subject: [PATCH 02/28] Enable gradle configuration caching --- gradle.properties | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/gradle.properties b/gradle.properties index 25870ec2e93..62db2aee975 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,16 +5,9 @@ org.gradle.vfs.watch=true org.gradle.jvmargs=-Xmx6g # hint by https://docs.gradle.org/current/userguide/performance.html#enable_configuration_cache -# Blocked by https://github.com/beryx/badass-jlink-plugin/issues/304 -# org.gradle.configuration-cache=true - +org.gradle.configuration-cache=true # org.gradle.configuration-cache.parallel=true -# Setting to 0 currently blocked by https://github.com/beryx/badass-jlink-plugin/issues/304 -# org.gradle.configuration-cache.max-problems=255 -# Having 0 errors is currently blocked by https://github.com/beryx/badass-jlink-plugin/issues/304 -# org.gradle.configuration-cache.problems=warn - # hint by https://docs.gradle.org/current/userguide/performance.html#enable_the_build_cache org.gradle.caching=true From 6d5d9928f57eece7a9709b7c26c32c7234f6dfbe Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 24 Jun 2025 17:28:38 +0200 Subject: [PATCH 03/28] Update gradle.properties --- gradle.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 62db2aee975..ac89e516163 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,8 @@ org.gradle.vfs.watch=true org.gradle.jvmargs=-Xmx6g # hint by https://docs.gradle.org/current/userguide/performance.html#enable_configuration_cache -org.gradle.configuration-cache=true +# Blocked by https://github.com/jbangdev/jbang-gradle-plugin/issues/7 +org.gradle.configuration-cache=false # org.gradle.configuration-cache.parallel=true # hint by https://docs.gradle.org/current/userguide/performance.html#enable_the_build_cache From 7400e8006087f91c4619bb95372a214b99c85a0c Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 16:33:34 +0200 Subject: [PATCH 04/28] Also build the portable version for all targets (app-image) --- .../kotlin/org.jabref.gradle.base.targets.gradle.kts | 10 +++++----- versions/build.gradle.kts | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts b/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts index 3895ade1b57..3c85b50d8b8 100644 --- a/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts +++ b/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts @@ -18,28 +18,28 @@ javaModulePackaging { target("ubuntu-22.04") { operatingSystem = OperatingSystemFamily.LINUX architecture = MachineArchitecture.X86_64 - packageTypes = listOf("deb") + packageTypes = listOf("app-image", "deb") } target("ubuntu-22.04-arm") { operatingSystem = OperatingSystemFamily.LINUX architecture = MachineArchitecture.ARM64 - packageTypes = listOf("deb") + packageTypes = listOf("app-image", "deb") } target("macos-13") { operatingSystem = OperatingSystemFamily.MACOS architecture = MachineArchitecture.X86_64 - packageTypes = listOf("dmg") + packageTypes = listOf("app-image", "dmg") singleStepPackaging = true } target("macos-14") { operatingSystem = OperatingSystemFamily.MACOS architecture = MachineArchitecture.ARM64 - packageTypes = listOf("dmg") + packageTypes = listOf("app-image", "dmg") singleStepPackaging = true } target("windows-2022") { operatingSystem = OperatingSystemFamily.WINDOWS architecture = MachineArchitecture.X86_64 - packageTypes = listOf("msi") + packageTypes = listOf("app-image", "msi") } } diff --git a/versions/build.gradle.kts b/versions/build.gradle.kts index 15e944a165f..e41f535a363 100644 --- a/versions/build.gradle.kts +++ b/versions/build.gradle.kts @@ -116,6 +116,7 @@ dependencies.constraints { api("org.hibernate.validator:hibernate-validator:9.0.1.Final") api("org.jabref:afterburner.fx:2.0.0") api("org.jabref:easybind:2.2.1-SNAPSHOT") + api("org.jetbrains:annotations:26.0.2") api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.21") api("org.jooq:jool:0.9.15") api("org.jsoup:jsoup:1.20.1") From a7c5a1cfed8c44aad3a9b14123557d95e65a1033 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 16:43:37 +0200 Subject: [PATCH 05/28] Also build 'pkg' ony MacOS --- .../src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts b/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts index 3c85b50d8b8..f2c015f43f2 100644 --- a/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts +++ b/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts @@ -28,13 +28,13 @@ javaModulePackaging { target("macos-13") { operatingSystem = OperatingSystemFamily.MACOS architecture = MachineArchitecture.X86_64 - packageTypes = listOf("app-image", "dmg") + packageTypes = listOf("app-image", "dmg", "pkg") singleStepPackaging = true } target("macos-14") { operatingSystem = OperatingSystemFamily.MACOS architecture = MachineArchitecture.ARM64 - packageTypes = listOf("app-image", "dmg") + packageTypes = listOf("app-image", "dmg", "pkg") singleStepPackaging = true } target("windows-2022") { From 436e2f4b8820abc2ac4a4f76ff9c51516fbb23ec Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 16:48:30 +0200 Subject: [PATCH 06/28] Continue to change 'binaries' job to use 'packages' folder... ...and remove some special case handling of MacOS --- .github/workflows/binaries.yml | 164 +++++---------------------------- 1 file changed, 22 insertions(+), 142 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 8718d560668..b857be866f3 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -138,20 +138,20 @@ jobs: # if you change the os version rename all other occurrences - os: ubuntu-22.04 displayName: linux - archivePortable: tar -c -C jabgui/build/distributions JabRef | pigz --rsyncable > jabgui/build/distributions/JabRef-portable_linux.tar.gz && rm -R jabgui/build/distributions/JabRef - archivePortableJabKit: tar -c -C jabkit/build/distributions jabkit | pigz --rsyncable > jabkit/build/distributions/jabkit-portable_linux.tar.gz && rm -R jabkit/build/distributions/jabkit + archivePortable: tar -c -C jabgui/packages/${{ matrix.os }} JabRef | pigz --rsyncable > jabgui/packages/${{ matrix.os }}/JabRef-portable_linux.tar.gz && rm -R jabgui/packages/${{ matrix.os }}/JabRef + archivePortableJabKit: tar -c -C jabkit/packages/${{ matrix.os }} jabkit | pigz --rsyncable > jabkit/packages/${{ matrix.os }}/jabkit-portable_linux.tar.gz && rm -R jabkit/packages/${{ matrix.os }}/jabkit suffix: '' archForDebianRepack: '_amd64' - os: ubuntu-22.04-arm displayName: linux-arm - archivePortable: tar -c -C jabgui/build/distributions JabRef | pigz --rsyncable > jabgui/build/distributions/JabRef-portable_linux_arm64.tar.gz && rm -R jabgui/build/distributions/JabRef - archivePortableJabKit: tar -c -C jabkit/build/distributions jabkit | pigz --rsyncable > jabkit/build/distributions/jabkit-portable_linux_arm64.tar.gz && rm -R jabkit/build/distributions/jabkit + archivePortable: tar -c -C jabgui/packages/${{ matrix.os }} JabRef | pigz --rsyncable > jabgui/packages/${{ matrix.os }}/JabRef-portable_linux_arm64.tar.gz && rm -R jabgui/packages/${{ matrix.os }}/JabRef + archivePortableJabKit: tar -c -C jabkit/packages/${{ matrix.os }} jabkit | pigz --rsyncable > jabkit/packages/${{ matrix.os }}/jabkit-portable_linux_arm64.tar.gz && rm -R jabkit/packages/${{ matrix.os }}/jabkit suffix: '_arm64' archForDebianRepack: '_arm64' - os: windows-latest displayName: windows - archivePortable: 7z a -r jabgui/build/distributions/JabRef-portable_windows.zip ./jabgui/build/distributions/JabRef && rm -R jabgui/build/distributions/JabRef - archivePortableJabKit: 7z a -r jabkit/build/distributions/jabkit-portable_windows.zip ./jabkit/build/distributions/jabkit && rm -R jabkit/build/distributions/jabkit + archivePortable: 7z a -r jabgui/packages/${{ matrix.os }}/JabRef-portable_windows.zip ./jabgui/packages/${{ matrix.os }}/JabRef && rm -R jabgui/packages/${{ matrix.os }}/JabRef + archivePortableJabKit: 7z a -r jabkit/packages/${{ matrix.os }}/jabkit-portable_windows.zip ./jabkit/packages/${{ matrix.os }}/jabkit && rm -R jabkit/packages/${{ matrix.os }}/jabkit suffix: '' archForDebianRepack: '' - os: macos-13 # intel image @@ -175,12 +175,6 @@ jobs: fetch-depth: 0 submodules: 'true' show-progress: 'false' - - name: Fetch preview of java-module-packaging - uses: actions/checkout@v4 - with: - repository: gradlex-org/java-module-packaging - path: build-logic/java-module-packaging - ref: preview - name: Install pigz and cache (linux) if: (startsWith(matrix.os, 'ubuntu')) uses: awalsh128/cache-apt-pkgs-action@latest @@ -236,132 +230,24 @@ jobs: p12-password: ${{ secrets.OSX_CERT_PWD }} create-keychain: false keychain-password: jabref - - name: Build dmg (macOS) - if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') - shell: bash - run: | - set -e - cd jabgui - - jpackage \ - --module org.jabref/org.jabref.Launcher \ - --module-path $JAVA_HOME/jmods/:build/jlinkbase/jlinkjars \ - --add-modules org.jabref,org.jabref.merged.module \ - --add-modules jdk.incubator.vector \ - --dest build/distributions \ - --app-content buildres/mac/Resources \ - --name JabRef \ - --app-version ${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }} \ - --verbose \ - --mac-sign \ - --vendor "JabRef e.V." \ - --mac-package-identifier JabRef \ - --mac-package-name JabRef \ - --type dmg --mac-signing-key-user-name "JabRef e.V. (6792V39SK3)" \ - --mac-package-signing-prefix org.jabref \ - --mac-entitlements buildres/mac/jabref.entitlements \ - --icon src/main/resources/icons/jabref.icns \ - --resource-dir buildres/mac \ - --file-associations buildres/mac/bibtexAssociations.properties \ - --jlink-options --bind-services \ - --java-options -XX:+UnlockExperimentalVMOptions \ - --java-options -XX:+UseCompactObjectHeaders \ - --java-options -XX:+UseZGC --java-options -XX:+ZUncommit \ - --java-options -XX:+UseStringDeduplication \ - --java-options --add-exports=javafx.base/com.sun.javafx.event=org.jabref.merged.module \ - --java-options --add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.graphics/javafx.scene=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control.skin=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref \ - --java-options --add-exports=javafx.base/com.sun.javafx.event=org.jabref \ - --java-options --add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.graphics/javafx.scene=org.jabref \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.base/javafx.collections=org.jabref \ - --java-options --add-opens=javafx.base/javafx.collections.transformation=org.jabref \ - --java-options --add-modules=jdk.incubator.vector \ - --java-options --enable-native-access=org.jabref.merged.module,ai.djl.tokenizers,ai.djl.pytorch_engine,com.sun.jna,javafx.graphics,javafx.media,javafx.web,jkeychain,org.apache.lucene.core - - name: Build pkg (macOS) - if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') - shell: bash - run: | - set -e - cd jabgui - - jpackage \ - --module org.jabref/org.jabref.Launcher \ - --module-path $JAVA_HOME/jmods/:build/jlinkbase/jlinkjars \ - --add-modules org.jabref,org.jabref.merged.module \ - --add-modules jdk.incubator.vector \ - --dest build/distributions \ - --app-content buildres/mac/Resources \ - --name JabRef \ - --app-version ${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }} \ - --verbose \ - --mac-sign \ - --vendor "JabRef e.V." \ - --mac-package-identifier JabRef \ - --mac-package-name JabRef \ - --type pkg --mac-signing-key-user-name "JabRef e.V. (6792V39SK3)" \ - --mac-package-signing-prefix org.jabref \ - --mac-entitlements buildres/mac/jabref.entitlements \ - --icon src/main/resources/icons/jabref.icns \ - --resource-dir buildres/mac \ - --file-associations buildres/mac/bibtexAssociations.properties \ - --jlink-options --bind-services \ - --java-options --add-exports=javafx.base/com.sun.javafx.event=org.jabref.merged.module \ - --java-options --add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.graphics/javafx.scene=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref.merged.module \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref \ - --java-options --add-exports=javafx.base/com.sun.javafx.event=org.jabref \ - --java-options --add-exports=javafx.controls/com.sun.javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.graphics/javafx.scene=org.jabref \ - --java-options --add-opens=javafx.controls/javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.controls/com.sun.javafx.scene.control=org.jabref \ - --java-options --add-opens=javafx.base/javafx.collections=org.jabref \ - --java-options --add-opens=javafx.base/javafx.collections.transformation=org.jabref \ - --java-options --add-modules=jdk.incubator.vector \ - --java-options --enable-native-access=org.jabref.merged.module,ai.djl.tokenizers,ai.djl.pytorch_engine,com.sun.jna,javafx.graphics,javafx.media,javafx.web,jkeychain,org.apache.lucene.core - - name: Rename files for mac - if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') - shell: bash - run: | - cd jabgui - ls build/distributions - mv build/distributions/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}.dmg build/distributions/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.dmg - mv build/distributions/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}.pkg build/distributions/JabRef-${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.pkg - - name: Build runtime image and installer (linux, Windows) - if: ${{ !startsWith(matrix.os, 'macos') }} + - name: Build runtime image and installer shell: bash run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabgui:jpackage - - name: Package JabGui application image (linux, Windows) - if: ${{ !startsWith(matrix.os, 'macos') }} + - name: Package JabGui application image shell: bash run: | set -e - ls -la jabgui/build/distributions - # TODO: portable version is currently very different - # ${{ matrix.archivePortable }} + ${{ matrix.archivePortable }} - name: Rename files - if: ${{ !startsWith(matrix.os, 'macos') }} shell: pwsh run: | - ls jabgui/build/distributions - # get-childitem -Path jabgui/build/distributions/* | rename-item -NewName {$_.name -replace "${{ steps.gitversion.outputs.AssemblySemVer }}","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}"} - # get-childitem -Path jabgui/build/distributions/* | rename-item -NewName {$_.name -replace "portable","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}-portable"} - ls jabgui/build/packages get-childitem -Path 'jabgui/build/packages/*/*' | rename-item -NewName {$_.name -replace "${{ steps.gitversion.outputs.AssemblySemVer }}","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}"} get-childitem -Path 'jabgui/build/packages/*/*' | rename-item -NewName {$_.name -replace "portable","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}-portable"} - name: Repack deb file for Debian if: (startsWith(matrix.os, 'ubuntu')) shell: bash run: | - cd jabgui/build/packages/${{ matrix. os}} + cd jabgui/build/packages/${{ matrix.os }} ls -l ar x jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}${{ matrix.archForDebianRepack }}.deb rm jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}${{ matrix.archForDebianRepack }}.deb @@ -372,19 +258,13 @@ jobs: mv -f jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}${{ matrix.archForDebianRepack }}_repackaged.deb jabref_${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}.deb - name: Build JabKit - if: ${{ !startsWith(matrix.os, 'macos') }} shell: bash run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabkit:jpackage - - name: Remove JabKit app build (macOS) - if: ${{ false && startsWith(matrix.os, 'macos') }} - run: rm -rf jabkit/build/distributions/jabkit.app - name: Package JabKit application image (linux, Windows) - if: ${{ !startsWith(matrix.os, 'macos') && (needs.conditions.outputs.secretspresent == 'true') }} shell: bash run: | set -e - # TODO: portable version is currently very different - # ${{ matrix.archivePortableJabKit }} + ${{ matrix.archivePortableJabKit }} # region Upload to builds.jabref.org / GitHub artifacts store - name: Setup SSH key @@ -420,23 +300,23 @@ jobs: shell: cmd # for rsync installed by chocolatey, we need the ssh.exe delivered with that installation run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload jabkkit to builds.jabref.org (Windows) if: ${{ (steps.diskspace.outputs.available == 'true') && (matrix.os == 'windows-latest') }} shell: cmd # for rsync installed by chocolatey, we need the ssh.exe delivered with that installation run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload jabgui to builds.jabref.org (linux, macOS) if: ${{ (steps.diskspace.outputs.available == 'true') && (startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu')) }} shell: bash run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload jabkit to builds.jabref.org (linux, macOS) if: ${{ (steps.diskspace.outputs.available == 'true') && (startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu')) }} shell: bash run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload to GitHub workflow artifacts store (macOS) if: ${{ (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.should-notarize == 'true') }} uses: actions/upload-artifact@v4 @@ -444,8 +324,8 @@ jobs: # tbn = to-be-notarized name: JabRef-${{ matrix.os }}-tbn path: | - jabgui/build/distributions - jabkit/build/distributions + jabgui/packages/${{ matrix.os }} + jabkit/packages/${{ matrix.os }} compression-level: 0 # no compression # endregion @@ -492,18 +372,18 @@ jobs: cd jabgui find . -type f xcrun notarytool store-credentials "notarytool-profile" --apple-id "vorstand@jabref.org" --team-id "6792V39SK3" --password "${{ secrets.OSX_NOTARIZATION_APP_PWD }}" - xcrun notarytool submit build/distributions/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg --keychain-profile "notarytool-profile" --wait - xcrun stapler staple build/distributions/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg + xcrun notarytool submit packages/${{ matrix.os }}/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg --keychain-profile "notarytool-profile" --wait + xcrun stapler staple packages/${{ matrix.os }}/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.dmg - name: Notarize pkg shell: bash run: | cd jabgui xcrun notarytool store-credentials "notarytool-profile" --apple-id "vorstand@jabref.org" --team-id "6792V39SK3" --password "${{ secrets.OSX_NOTARIZATION_APP_PWD }}" - xcrun notarytool submit build/distributions/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg --keychain-profile "notarytool-profile" --wait - xcrun stapler staple build/distributions/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg + xcrun notarytool submit packages/${{ matrix.os }}/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg --keychain-profile "notarytool-profile" --wait + xcrun stapler staple packages/${{ matrix.os }}/JabRef-${{ needs.build.outputs.major }}.${{ needs.build.outputs.minor }}${{ matrix.suffix}}.pkg - name: Upload to builds.jabref.org shell: bash run: | echo "${{ secrets.buildJabRefPrivateKey }}" > sshkey chmod 600 sshkey - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/distributions/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }}/ + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }}/ From c8c76cb13ed7b90b2d8603dd3531cdc66946ad28 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 16:55:44 +0200 Subject: [PATCH 07/28] Add newline (checkstyle) --- build-logic/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-logic/.gitignore b/build-logic/.gitignore index 982b2c99b17..6f66fcb7ce0 100644 --- a/build-logic/.gitignore +++ b/build-logic/.gitignore @@ -1 +1 @@ -java-module-packaging \ No newline at end of file +java-module-packaging From 54d3c700185f94616db67c0b1fdea05e0e1f38ca Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 18:39:21 +0200 Subject: [PATCH 08/28] Fix binaries.yml (1) --- .github/workflows/binaries.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index b857be866f3..5389e97cd15 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -138,28 +138,30 @@ jobs: # if you change the os version rename all other occurrences - os: ubuntu-22.04 displayName: linux - archivePortable: tar -c -C jabgui/packages/${{ matrix.os }} JabRef | pigz --rsyncable > jabgui/packages/${{ matrix.os }}/JabRef-portable_linux.tar.gz && rm -R jabgui/packages/${{ matrix.os }}/JabRef - archivePortableJabKit: tar -c -C jabkit/packages/${{ matrix.os }} jabkit | pigz --rsyncable > jabkit/packages/${{ matrix.os }}/jabkit-portable_linux.tar.gz && rm -R jabkit/packages/${{ matrix.os }}/jabkit + archivePortable: tar -c -C jabgui/packages/ubuntu-22.04 JabRef | pigz --rsyncable > jabgui/packages/ubuntu-22.04/JabRef-portable_linux.tar.gz && rm -R jabgui/packages/ubuntu-22.04/JabRef + archivePortableJabKit: tar -c -C jabkit/packages/ubuntu-22.04 jabkit | pigz --rsyncable > jabkit/packages/ubuntu-22.04/jabkit-portable_linux.tar.gz && rm -R jabkit/packages/ubuntu-22.04/jabkit suffix: '' archForDebianRepack: '_amd64' - os: ubuntu-22.04-arm displayName: linux-arm - archivePortable: tar -c -C jabgui/packages/${{ matrix.os }} JabRef | pigz --rsyncable > jabgui/packages/${{ matrix.os }}/JabRef-portable_linux_arm64.tar.gz && rm -R jabgui/packages/${{ matrix.os }}/JabRef - archivePortableJabKit: tar -c -C jabkit/packages/${{ matrix.os }} jabkit | pigz --rsyncable > jabkit/packages/${{ matrix.os }}/jabkit-portable_linux_arm64.tar.gz && rm -R jabkit/packages/${{ matrix.os }}/jabkit + archivePortable: tar -c -C jabgui/packages/ubuntu-22.04-arm JabRef | pigz --rsyncable > jabgui/packages/ubuntu-22.04-arm/JabRef-portable_linux_arm64.tar.gz && rm -R jabgui/packages/ubuntu-22.04-arm/JabRef + archivePortableJabKit: tar -c -C jabkit/packages/ubuntu-22.04-arm jabkit | pigz --rsyncable > jabkit/packages/ubuntu-22.04-arm/jabkit-portable_linux_arm64.tar.gz && rm -R jabkit/packages/ubuntu-22.04-arm/jabkit suffix: '_arm64' archForDebianRepack: '_arm64' - os: windows-latest displayName: windows - archivePortable: 7z a -r jabgui/packages/${{ matrix.os }}/JabRef-portable_windows.zip ./jabgui/packages/${{ matrix.os }}/JabRef && rm -R jabgui/packages/${{ matrix.os }}/JabRef - archivePortableJabKit: 7z a -r jabkit/packages/${{ matrix.os }}/jabkit-portable_windows.zip ./jabkit/packages/${{ matrix.os }}/jabkit && rm -R jabkit/packages/${{ matrix.os }}/jabkit + archivePortable: 7z a -r jabgui/packages/windows-latest/JabRef-portable_windows.zip ./jabgui/packages/windows-latest/JabRef && rm -R jabgui/packages/windows-latest/JabRef + archivePortableJabKit: 7z a -r jabkit/packages/windows-latest/jabkit-portable_windows.zip ./jabkit/packages/windows-latest/jabkit && rm -R jabkit/packages/windows-latest/jabkit suffix: '' archForDebianRepack: '' - os: macos-13 # intel image - displayName: macOS + archivePortable: 7z a -r jabgui/packages/macos-13/JabRef-portable_windows.zip ./jabgui/packages/macos-13/JabRef && rm -R jabgui/packages/macos-13/JabRef + archivePortableJabKit: 7z a -r jabkit/packages/macos-13/jabkit-portable_windows.zip ./jabkit/packages/macos-13/jabkit && rm -R jabkit/packages/macos-13/jabkit suffix: '' archForDebianRepack: '' - os: macos-14 - displayName: macOS (ARM64) + archivePortable: 7z a -r jabgui/packages/macos-14/JabRef-portable_windows.zip ./jabgui/packages/macos-14/JabRef && rm -R jabgui/packages/macos-14/JabRef + archivePortableJabKit: 7z a -r jabkit/packages/macos-14/jabkit-portable_windows.zip ./jabkit/packages/macos-14/jabkit && rm -R jabkit/packages/macos-14/jabkit suffix: '_arm64' archForDebianRepack: '' runs-on: ${{ matrix.os }} From a5aa2394a2948a347cd9eeff99c33f9131464164 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 18:45:39 +0200 Subject: [PATCH 09/28] Fix binaries.yml (2) --- .github/workflows/binaries.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 5389e97cd15..629c323c7b6 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -155,11 +155,13 @@ jobs: suffix: '' archForDebianRepack: '' - os: macos-13 # intel image + displayName: macos archivePortable: 7z a -r jabgui/packages/macos-13/JabRef-portable_windows.zip ./jabgui/packages/macos-13/JabRef && rm -R jabgui/packages/macos-13/JabRef archivePortableJabKit: 7z a -r jabkit/packages/macos-13/jabkit-portable_windows.zip ./jabkit/packages/macos-13/jabkit && rm -R jabkit/packages/macos-13/jabkit suffix: '' archForDebianRepack: '' - os: macos-14 + displayName: macos-arm archivePortable: 7z a -r jabgui/packages/macos-14/JabRef-portable_windows.zip ./jabgui/packages/macos-14/JabRef && rm -R jabgui/packages/macos-14/JabRef archivePortableJabKit: 7z a -r jabkit/packages/macos-14/jabkit-portable_windows.zip ./jabkit/packages/macos-14/jabkit && rm -R jabkit/packages/macos-14/jabkit suffix: '_arm64' @@ -177,6 +179,12 @@ jobs: fetch-depth: 0 submodules: 'true' show-progress: 'false' + - name: Fetch preview of java-module-packaging + uses: actions/checkout@v4 + with: + repository: gradlex-org/java-module-packaging + path: build-logic/java-module-packaging + ref: preview - name: Install pigz and cache (linux) if: (startsWith(matrix.os, 'ubuntu')) uses: awalsh128/cache-apt-pkgs-action@latest From a8c7a988942f87a45a7c43a8c39ba9b6c7c09427 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 20:05:22 +0200 Subject: [PATCH 10/28] Fix binaries.yml (3) --- .github/workflows/binaries.yml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 629c323c7b6..f167ad7b4d6 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -138,32 +138,32 @@ jobs: # if you change the os version rename all other occurrences - os: ubuntu-22.04 displayName: linux - archivePortable: tar -c -C jabgui/packages/ubuntu-22.04 JabRef | pigz --rsyncable > jabgui/packages/ubuntu-22.04/JabRef-portable_linux.tar.gz && rm -R jabgui/packages/ubuntu-22.04/JabRef - archivePortableJabKit: tar -c -C jabkit/packages/ubuntu-22.04 jabkit | pigz --rsyncable > jabkit/packages/ubuntu-22.04/jabkit-portable_linux.tar.gz && rm -R jabkit/packages/ubuntu-22.04/jabkit + archivePortable: tar -c -C jabgui/build/packages/ubuntu-22.04 JabRef | pigz --rsyncable > jabgui/build/packages/ubuntu-22.04/JabRef-portable_linux.tar.gz && rm -R jabgui/build/packages/ubuntu-22.04/JabRef + archivePortableJabKit: tar -c -C jabkit/build/packages/ubuntu-22.04 jabkit | pigz --rsyncable > jabkit/build/packages/ubuntu-22.04/jabkit-portable_linux.tar.gz && rm -R jabkit/build/packages/ubuntu-22.04/jabkit suffix: '' archForDebianRepack: '_amd64' - os: ubuntu-22.04-arm displayName: linux-arm - archivePortable: tar -c -C jabgui/packages/ubuntu-22.04-arm JabRef | pigz --rsyncable > jabgui/packages/ubuntu-22.04-arm/JabRef-portable_linux_arm64.tar.gz && rm -R jabgui/packages/ubuntu-22.04-arm/JabRef - archivePortableJabKit: tar -c -C jabkit/packages/ubuntu-22.04-arm jabkit | pigz --rsyncable > jabkit/packages/ubuntu-22.04-arm/jabkit-portable_linux_arm64.tar.gz && rm -R jabkit/packages/ubuntu-22.04-arm/jabkit + archivePortable: tar -c -C jabgui/build/packages/ubuntu-22.04-arm JabRef | pigz --rsyncable > jabgui/build/packages/ubuntu-22.04-arm/JabRef-portable_linux_arm64.tar.gz && rm -R jabgui/build/packages/ubuntu-22.04-arm/JabRef + archivePortableJabKit: tar -c -C jabkit/build/packages/ubuntu-22.04-arm jabkit | pigz --rsyncable > jabkit/build/packages/ubuntu-22.04-arm/jabkit-portable_linux_arm64.tar.gz && rm -R jabkit/build/packages/ubuntu-22.04-arm/jabkit suffix: '_arm64' archForDebianRepack: '_arm64' - os: windows-latest displayName: windows - archivePortable: 7z a -r jabgui/packages/windows-latest/JabRef-portable_windows.zip ./jabgui/packages/windows-latest/JabRef && rm -R jabgui/packages/windows-latest/JabRef - archivePortableJabKit: 7z a -r jabkit/packages/windows-latest/jabkit-portable_windows.zip ./jabkit/packages/windows-latest/jabkit && rm -R jabkit/packages/windows-latest/jabkit + archivePortable: 7z a -r jabgui/build/packages/windows-latest/JabRef-portable_windows.zip ./jabgui/build/packages/windows-latest/JabRef && rm -R jabgui/build/packages/windows-latest/JabRef + archivePortableJabKit: 7z a -r jabkit/build/packages/windows-latest/jabkit-portable_windows.zip ./jabkit/build/packages/windows-latest/jabkit && rm -R jabkit/build/packages/windows-latest/jabkit suffix: '' archForDebianRepack: '' - os: macos-13 # intel image displayName: macos - archivePortable: 7z a -r jabgui/packages/macos-13/JabRef-portable_windows.zip ./jabgui/packages/macos-13/JabRef && rm -R jabgui/packages/macos-13/JabRef - archivePortableJabKit: 7z a -r jabkit/packages/macos-13/jabkit-portable_windows.zip ./jabkit/packages/macos-13/jabkit && rm -R jabkit/packages/macos-13/jabkit + archivePortable: 7z a -r jabgui/build/packages/macos-13/JabRef-portable_windows.zip ./jabgui/build/packages/macos-13/JabRef && rm -R jabgui/build/packages/macos-13/JabRef + archivePortableJabKit: 7z a -r jabkit/build/packages/macos-13/jabkit-portable_windows.zip ./jabkit/build/packages/macos-13/jabkit && rm -R jabkit/build/packages/macos-13/jabkit suffix: '' archForDebianRepack: '' - os: macos-14 displayName: macos-arm - archivePortable: 7z a -r jabgui/packages/macos-14/JabRef-portable_windows.zip ./jabgui/packages/macos-14/JabRef && rm -R jabgui/packages/macos-14/JabRef - archivePortableJabKit: 7z a -r jabkit/packages/macos-14/jabkit-portable_windows.zip ./jabkit/packages/macos-14/jabkit && rm -R jabkit/packages/macos-14/jabkit + archivePortable: 7z a -r jabgui/build/packages/macos-14/JabRef-portable_windows.zip ./jabgui/build/packages/macos-14/JabRef && rm -R jabgui/build/packages/macos-14/JabRef + archivePortableJabKit: 7z a -r jabkit/build/packages/macos-14/jabkit-portable_windows.zip ./jabkit/build/packages/macos-14/jabkit && rm -R jabkit/build/packages/macos-14/jabkit suffix: '_arm64' archForDebianRepack: '' runs-on: ${{ matrix.os }} @@ -310,23 +310,23 @@ jobs: shell: cmd # for rsync installed by chocolatey, we need the ssh.exe delivered with that installation run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload jabkkit to builds.jabref.org (Windows) if: ${{ (steps.diskspace.outputs.available == 'true') && (matrix.os == 'windows-latest') }} shell: cmd # for rsync installed by chocolatey, we need the ssh.exe delivered with that installation run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'C:\ProgramData\chocolatey\lib\rsync\tools\bin\ssh.exe -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload jabgui to builds.jabref.org (linux, macOS) if: ${{ (steps.diskspace.outputs.available == 'true') && (startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu')) }} shell: bash run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload jabkit to builds.jabref.org (linux, macOS) if: ${{ (steps.diskspace.outputs.available == 'true') && (startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu')) }} shell: bash run: | - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabkit/build/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ steps.gitversion.outputs.branchName }}/ || true - name: Upload to GitHub workflow artifacts store (macOS) if: ${{ (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.should-notarize == 'true') }} uses: actions/upload-artifact@v4 @@ -334,8 +334,8 @@ jobs: # tbn = to-be-notarized name: JabRef-${{ matrix.os }}-tbn path: | - jabgui/packages/${{ matrix.os }} - jabkit/packages/${{ matrix.os }} + jabgui/build/packages/${{ matrix.os }} + jabkit/build/packages/${{ matrix.os }} compression-level: 0 # no compression # endregion @@ -396,4 +396,4 @@ jobs: run: | echo "${{ secrets.buildJabRefPrivateKey }}" > sshkey chmod 600 sshkey - rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }}/ + rsync -rt --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --itemize-changes --stats --rsync-path="mkdir -p /var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }} && rsync" -e 'ssh -p 9922 -i sshkey -o StrictHostKeyChecking=no' jabgui/build/packages/${{ matrix.os }}/ jrrsync@build-upload.jabref.org:/var/www/builds.jabref.org/www/${{ needs.build.outputs.branchname }}/ From 97741fec4d61c15b71e59ab10d23bcb82bb6fdf9 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 20:21:25 +0200 Subject: [PATCH 11/28] Fix binaries.yml (4) --- .github/workflows/binaries.yml | 8 ++++---- .../main/kotlin/org.jabref.gradle.base.targets.gradle.kts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index f167ad7b4d6..6a1a710202d 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -156,14 +156,14 @@ jobs: archForDebianRepack: '' - os: macos-13 # intel image displayName: macos - archivePortable: 7z a -r jabgui/build/packages/macos-13/JabRef-portable_windows.zip ./jabgui/build/packages/macos-13/JabRef && rm -R jabgui/build/packages/macos-13/JabRef - archivePortableJabKit: 7z a -r jabkit/build/packages/macos-13/jabkit-portable_windows.zip ./jabkit/build/packages/macos-13/jabkit && rm -R jabkit/build/packages/macos-13/jabkit + archivePortable: 7z a -r jabgui/build/packages/macos-13/JabRef-portable_macos.zip ./jabgui/build/packages/macos-13/JabRef.app && rm -R jabgui/build/packages/macos-13/JabRef + archivePortableJabKit: 7z a -r jabkit/build/packages/macos-13/jabkit-portable_macos.zip ./jabkit/build/packages/macos-13/jabkit.app && rm -R jabkit/build/packages/macos-13/jabkit suffix: '' archForDebianRepack: '' - os: macos-14 displayName: macos-arm - archivePortable: 7z a -r jabgui/build/packages/macos-14/JabRef-portable_windows.zip ./jabgui/build/packages/macos-14/JabRef && rm -R jabgui/build/packages/macos-14/JabRef - archivePortableJabKit: 7z a -r jabkit/build/packages/macos-14/jabkit-portable_windows.zip ./jabkit/build/packages/macos-14/jabkit && rm -R jabkit/build/packages/macos-14/jabkit + archivePortable: 7z a -r jabgui/build/packages/macos-14/JabRef-portable_macos-arm.zip ./jabgui/build/packages/macos-14/JabRef.app && rm -R jabgui/build/packages/macos-14/JabRef.app + archivePortableJabKit: 7z a -r jabkit/build/packages/macos-14/jabkit-portable_macos-arm.zip ./jabkit/build/packages/macos-14/jabkit.app && rm -R jabkit/build/packages/macos-14/jabkit.app suffix: '_arm64' archForDebianRepack: '' runs-on: ${{ matrix.os }} diff --git a/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts b/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts index f2c015f43f2..ed0ab3ca2c9 100644 --- a/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts +++ b/build-logic/src/main/kotlin/org.jabref.gradle.base.targets.gradle.kts @@ -37,7 +37,7 @@ javaModulePackaging { packageTypes = listOf("app-image", "dmg", "pkg") singleStepPackaging = true } - target("windows-2022") { + target("windows-latest") { operatingSystem = OperatingSystemFamily.WINDOWS architecture = MachineArchitecture.X86_64 packageTypes = listOf("app-image", "msi") From fe66df1c0f5490698a233534cdd3a6ea9975775b Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 22:31:42 +0200 Subject: [PATCH 12/28] Fix binaries.yml (5) --- .github/workflows/binaries.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 6a1a710202d..bf50615d4e9 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -156,14 +156,14 @@ jobs: archForDebianRepack: '' - os: macos-13 # intel image displayName: macos - archivePortable: 7z a -r jabgui/build/packages/macos-13/JabRef-portable_macos.zip ./jabgui/build/packages/macos-13/JabRef.app && rm -R jabgui/build/packages/macos-13/JabRef - archivePortableJabKit: 7z a -r jabkit/build/packages/macos-13/jabkit-portable_macos.zip ./jabkit/build/packages/macos-13/jabkit.app && rm -R jabkit/build/packages/macos-13/jabkit + archivePortable: 7z a -r jabgui/build/packages/macos-13/JabRef-portable_macos.zip ./jabgui/build/packages/macos-13/JabRef.app && rm -R jabgui/build/packages/macos-13/JabRef.app + archivePortableJabKit: 7z a -r jabkit/build/packages/macos-13/jabkit-portable_macos.zip ./jabkit/build/packages/macos-13/jabkit.app && rm -R jabkit/build/packages/macos-13/jabkit.app suffix: '' archForDebianRepack: '' - os: macos-14 displayName: macos-arm - archivePortable: 7z a -r jabgui/build/packages/macos-14/JabRef-portable_macos-arm.zip ./jabgui/build/packages/macos-14/JabRef.app && rm -R jabgui/build/packages/macos-14/JabRef.app - archivePortableJabKit: 7z a -r jabkit/build/packages/macos-14/jabkit-portable_macos-arm.zip ./jabkit/build/packages/macos-14/jabkit.app && rm -R jabkit/build/packages/macos-14/jabkit.app + archivePortable: tar -c -C jabgui/build/packages/macos-14/JabRef-portable_macos-arm.zip ./jabgui/build/packages/macos-14/JabRef.app && rm -R jabgui/build/packages/macos-14/JabRef.app + archivePortableJabKit: tar -c -C jabkit/build/packages/macos-14/jabkit-portable_macos-arm.zip ./jabkit/build/packages/macos-14/jabkit.app && rm -R jabkit/build/packages/macos-14/jabkit.app suffix: '_arm64' archForDebianRepack: '' runs-on: ${{ matrix.os }} @@ -270,7 +270,7 @@ jobs: - name: Build JabKit shell: bash run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabkit:jpackage - - name: Package JabKit application image (linux, Windows) + - name: Package JabKit application image shell: bash run: | set -e From 7caaf76fba5c836ce021f6d590377c1b4d28f108 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Fri, 27 Jun 2025 22:42:13 +0200 Subject: [PATCH 13/28] Configure signing for Mac targets --- .github/workflows/binaries.yml | 4 ++-- jabgui/build.gradle.kts | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index bf50615d4e9..1c22cb6a6d9 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -162,8 +162,8 @@ jobs: archForDebianRepack: '' - os: macos-14 displayName: macos-arm - archivePortable: tar -c -C jabgui/build/packages/macos-14/JabRef-portable_macos-arm.zip ./jabgui/build/packages/macos-14/JabRef.app && rm -R jabgui/build/packages/macos-14/JabRef.app - archivePortableJabKit: tar -c -C jabkit/build/packages/macos-14/jabkit-portable_macos-arm.zip ./jabkit/build/packages/macos-14/jabkit.app && rm -R jabkit/build/packages/macos-14/jabkit.app + archivePortable: 7z a -r jabgui/build/packages/macos-14/JabRef-portable_macos-arm.zip ./jabgui/build/packages/macos-14/JabRef.app && rm -R jabgui/build/packages/macos-14/JabRef.app + archivePortableJabKit: 7z a -r jabkit/build/packages/macos-14/jabkit-portable_macos-arm.zip ./jabkit/build/packages/macos-14/jabkit.app && rm -R jabkit/build/packages/macos-14/jabkit.app suffix: '_arm64' archForDebianRepack: '' runs-on: ${{ matrix.os }} diff --git a/jabgui/build.gradle.kts b/jabgui/build.gradle.kts index f26aa4c2f37..c15cffa1d43 100644 --- a/jabgui/build.gradle.kts +++ b/jabgui/build.gradle.kts @@ -179,7 +179,10 @@ javaModulePackaging { options.addAll( "--mac-package-identifier", "JabRef", "--mac-package-name", "JabRef", - "--file-associations", "$projectDir/buildres/macos/bibtexAssociations.properties" + "--file-associations", "$projectDir/buildres/macos/bibtexAssociations.properties", + "--mac-sign", + "--mac-signing-key-user-name", "JabRef e.V. (6792V39SK3)", + "--mac-package-signing-prefix", "org.jabref", ) targetResources.from(layout.projectDirectory.dir("buildres/macos").asFileTree.matching { include("Resources/**") From 91bdb09e0e7212dad5e2181c6ed70e4d5ca05b3b Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Sat, 28 Jun 2025 17:01:09 +0200 Subject: [PATCH 14/28] Move java options into Gradle build --- jabgui/build.gradle.kts | 8 +++++++- jabkit/build.gradle.kts | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/jabgui/build.gradle.kts b/jabgui/build.gradle.kts index c15cffa1d43..b8c43c14825 100644 --- a/jabgui/build.gradle.kts +++ b/jabgui/build.gradle.kts @@ -130,7 +130,13 @@ application { "--add-opens", "java.base/java.nio=org.apache.pdfbox.io", // https://github.com/uncomplicate/neanderthal/issues/55 "--add-opens", "java.base/jdk.internal.ref=org.apache.pdfbox.io", - "--add-modules", "jdk.incubator.vector" + "--add-modules", "jdk.incubator.vector", + + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseCompactObjectHeaders", + "-XX:+UseZGC", + "-XX:+ZUncommit", + "-XX:+UseStringDeduplication" ) } diff --git a/jabkit/build.gradle.kts b/jabkit/build.gradle.kts index f92a5cb2c7c..713f19a3d72 100644 --- a/jabkit/build.gradle.kts +++ b/jabkit/build.gradle.kts @@ -62,7 +62,7 @@ application { mainClass.set("org.jabref.JabKit") mainModule.set("org.jabref.jabkit") - // Also passed to launcher (https://badass-jlink-plugin.beryx.org/releases/latest/#launcher) + // Also passed to launcher by java-module-packaging plugin applicationDefaultJvmArgs = listOf( // Enable JEP 450: Compact Object Headers "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCompactObjectHeaders", From 7f0878d04f1c317b4c5401e3330b96948f4cfe63 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Sat, 28 Jun 2025 17:01:58 +0200 Subject: [PATCH 15/28] Remove unnecessary 'assemble' step ...to not produce artifacts - like zipped Jar-based distribution - we do not need. --- .github/workflows/binaries.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 1c22cb6a6d9..39efbb62d68 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -222,9 +222,6 @@ jobs: - name: Setup JBang uses: jbangdev/setup-jbang@main - - name: Basic build (assemble) - run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" assemble - - name: Setup macOS key chain if: (startsWith(matrix.os, 'macos')) && (needs.conditions.outputs.secretspresent == 'true') uses: slidoapp/import-codesign-certs@1923310662e8682dd05b76b612b53301f431cd5d From 141c4c98e8dc9eb06283f2b62397f8227c031a4b Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Sat, 28 Jun 2025 18:05:42 +0200 Subject: [PATCH 16/28] macos -> macOS --- .github/workflows/binaries.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 39efbb62d68..27ca6846f4b 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -155,13 +155,13 @@ jobs: suffix: '' archForDebianRepack: '' - os: macos-13 # intel image - displayName: macos + displayName: macOS archivePortable: 7z a -r jabgui/build/packages/macos-13/JabRef-portable_macos.zip ./jabgui/build/packages/macos-13/JabRef.app && rm -R jabgui/build/packages/macos-13/JabRef.app archivePortableJabKit: 7z a -r jabkit/build/packages/macos-13/jabkit-portable_macos.zip ./jabkit/build/packages/macos-13/jabkit.app && rm -R jabkit/build/packages/macos-13/jabkit.app suffix: '' archForDebianRepack: '' - os: macos-14 - displayName: macos-arm + displayName: macOS-arm archivePortable: 7z a -r jabgui/build/packages/macos-14/JabRef-portable_macos-arm.zip ./jabgui/build/packages/macos-14/JabRef.app && rm -R jabgui/build/packages/macos-14/JabRef.app archivePortableJabKit: 7z a -r jabkit/build/packages/macos-14/jabkit-portable_macos-arm.zip ./jabkit/build/packages/macos-14/jabkit.app && rm -R jabkit/build/packages/macos-14/jabkit.app suffix: '_arm64' From d2231d5cd084527d31452aa7ae4b24c2e9f158c7 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 01:17:56 +0200 Subject: [PATCH 17/28] Fix filename(s) for JabKit --- .github/workflows/binaries.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 27ca6846f4b..4cb1fd0a7b0 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -272,6 +272,10 @@ jobs: run: | set -e ${{ matrix.archivePortableJabKit }} + - name: Rename files + shell: pwsh + run: | + get-childitem -Path 'jabkit/build/packages/*/*' | rename-item -NewName {$_.name -replace "${{ steps.gitversion.outputs.AssemblySemVer }}","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}"} # region Upload to builds.jabref.org / GitHub artifacts store - name: Setup SSH key From 7e0fdfce05c15eb38e08c16587dfe37b0939f528 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 01:19:03 +0200 Subject: [PATCH 18/28] Remove obsolete renaming for portable --- .github/workflows/binaries.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 4cb1fd0a7b0..29175df4fe5 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -249,7 +249,6 @@ jobs: shell: pwsh run: | get-childitem -Path 'jabgui/build/packages/*/*' | rename-item -NewName {$_.name -replace "${{ steps.gitversion.outputs.AssemblySemVer }}","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}"} - get-childitem -Path 'jabgui/build/packages/*/*' | rename-item -NewName {$_.name -replace "portable","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}-portable"} - name: Repack deb file for Debian if: (startsWith(matrix.os, 'ubuntu')) shell: bash From b4f2fb7f13448214d01cce0e194c759be91d0b17 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 01:21:34 +0200 Subject: [PATCH 19/28] Remove jabkit DMG --- .github/workflows/binaries.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 29175df4fe5..944c47b0f88 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -266,6 +266,9 @@ jobs: - name: Build JabKit shell: bash run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabkit:jpackage + - name: Remove jabkit dmg + shell: bash + run: rm jabkit/build/packages/*.dmg - name: Package JabKit application image shell: bash run: | From 399ab22fc7424ddcb7a58c1b55850e407201c8ca Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 12:05:58 +0200 Subject: [PATCH 20/28] Fix PIT for removal of jabkit dmg --- .github/workflows/binaries.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 944c47b0f88..23d2d86c223 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -266,14 +266,14 @@ jobs: - name: Build JabKit shell: bash run: ./gradlew -i -PprojVersion="${{ steps.gitversion.outputs.AssemblySemVer }}" -PprojVersionInfo="${{ steps.gitversion.outputs.InformationalVersion }}" :jabkit:jpackage - - name: Remove jabkit dmg - shell: bash - run: rm jabkit/build/packages/*.dmg - name: Package JabKit application image shell: bash run: | set -e ${{ matrix.archivePortableJabKit }} + - name: Remove jabkit dmg + shell: bash + run: rm jabkit/build/packages/*.dmg - name: Rename files shell: pwsh run: | From f18a281d9a7900154ddaf542605a11f5b9aee385 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 12:50:52 +0200 Subject: [PATCH 21/28] Fix removal of DMG --- .github/workflows/binaries.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 23d2d86c223..ffe31056c95 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -272,8 +272,9 @@ jobs: set -e ${{ matrix.archivePortableJabKit }} - name: Remove jabkit dmg + if: startsWith(matrix.os, 'macos') shell: bash - run: rm jabkit/build/packages/*.dmg + run: rm jabkit/build/packages/*/*.dmg - name: Rename files shell: pwsh run: | From 1a73456deb47fe1ff632019b1b83312bc1f3092c Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 13:26:41 +0200 Subject: [PATCH 22/28] Also remove .sha256 --- .github/workflows/binaries.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index ffe31056c95..08a9f3231a3 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -274,7 +274,7 @@ jobs: - name: Remove jabkit dmg if: startsWith(matrix.os, 'macos') shell: bash - run: rm jabkit/build/packages/*/*.dmg + run: rm jabkit/build/packages/*/*.dmg* - name: Rename files shell: pwsh run: | From 6cce46b9865c32d460d38cd989a6170b967beb6a Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 14:12:27 +0200 Subject: [PATCH 23/28] Try NOT to build dmg and pkg --- .github/workflows/binaries.yml | 8 -------- jabkit/build.gradle.kts | 7 +++++++ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index 08a9f3231a3..ce4ba57dfcd 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -271,14 +271,6 @@ jobs: run: | set -e ${{ matrix.archivePortableJabKit }} - - name: Remove jabkit dmg - if: startsWith(matrix.os, 'macos') - shell: bash - run: rm jabkit/build/packages/*/*.dmg* - - name: Rename files - shell: pwsh - run: | - get-childitem -Path 'jabkit/build/packages/*/*' | rename-item -NewName {$_.name -replace "${{ steps.gitversion.outputs.AssemblySemVer }}","${{ steps.gitversion.outputs.Major }}.${{ steps.gitversion.outputs.Minor }}${{ matrix.suffix }}"} # region Upload to builds.jabref.org / GitHub artifacts store - name: Setup SSH key diff --git a/jabkit/build.gradle.kts b/jabkit/build.gradle.kts index 713f19a3d72..b39a19f5771 100644 --- a/jabkit/build.gradle.kts +++ b/jabkit/build.gradle.kts @@ -78,15 +78,22 @@ application { javaModulePackaging { applicationName = "jabkit" addModules.add("jdk.incubator.vector") + + // All targets have to have "app-image" as sole target, since we do not distribute an installer targetsWithOs("windows") { // Error: Option [--win-console] is not valid with type [msi] // options.addAll( // "--win-console" // ) + packageTypes = listOf("app-image") } targetsWithOs("linux") { options.addAll( "--icon", "$projectDir/../jabgui/src/main/resources/icons/JabRef-linux-icon-64.png", ) + packageTypes = listOf("app-image") + } + targetsWithOs("macos") { + packageTypes = listOf("app-image") } } From 97dc2bde28fa38ace8c5c219d46c685a95a81a4f Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 14:14:03 +0200 Subject: [PATCH 24/28] Try "--win-console" --- jabkit/build.gradle.kts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/jabkit/build.gradle.kts b/jabkit/build.gradle.kts index b39a19f5771..4035c06acd4 100644 --- a/jabkit/build.gradle.kts +++ b/jabkit/build.gradle.kts @@ -81,10 +81,7 @@ javaModulePackaging { // All targets have to have "app-image" as sole target, since we do not distribute an installer targetsWithOs("windows") { - // Error: Option [--win-console] is not valid with type [msi] - // options.addAll( - // "--win-console" - // ) + options.addAll("--win-console") packageTypes = listOf("app-image") } targetsWithOs("linux") { From 289ce0b416a7d1cababe8568e855756b85860b12 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 15:18:24 +0200 Subject: [PATCH 25/28] Switch to fix --- .github/workflows/binaries.yml | 4 +- .github/workflows/tests.yml | 84 +++++++++++++++++----------------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml index ce4ba57dfcd..72f1143440a 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -182,9 +182,9 @@ jobs: - name: Fetch preview of java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Install pigz and cache (linux) if: (startsWith(matrix.os, 'ubuntu')) uses: awalsh128/cache-apt-pkgs-action@latest diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index bdc14fe182d..447b336b067 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -37,9 +37,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -68,9 +68,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -94,9 +94,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -122,9 +122,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: markdownlint-cli2-action uses: DavidAnson/markdownlint-cli2-action@v20 with: @@ -144,9 +144,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Generate JBang cache key id: cache-key shell: bash @@ -190,9 +190,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Cache clparse jar id: cache-clparse uses: actions/cache@v4 @@ -222,9 +222,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -249,9 +249,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -304,9 +304,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -345,9 +345,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -373,9 +373,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -404,9 +404,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - run: jbang build .jbang/CheckoutPR.java - run: jbang build .jbang/CloneJabRef.java - run: jbang build .jbang/JabKitLauncher.java @@ -451,9 +451,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK if: github.ref == 'refs/heads/main' uses: actions/setup-java@v4 @@ -489,9 +489,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -515,9 +515,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - uses: gradle/actions/wrapper-validation@v4 mandatory-checks-section-exists: @@ -542,9 +542,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Check for existence of Mandatory Checks section id: check_mandatory_section @@ -584,9 +584,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Check for PR checklist id: check_changelog_modification run: | @@ -633,9 +633,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Merge Conflict finder uses: olivernybroe/action-conflict-finder@v4.1 @@ -650,9 +650,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Check force push id: force_push_check run: | @@ -680,9 +680,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Check for submodule modifications id: check_submodule run: | @@ -736,9 +736,9 @@ jobs: - name: Checkout java-module-packaging uses: actions/checkout@v4 with: - repository: gradlex-org/java-module-packaging + repository: koppor/java-module-packaging path: build-logic/java-module-packaging - ref: preview + ref: fix-params - name: Check PR body for changelog note id: changelog_check run: | From 4f39601dbdc5cc47cf86f44fc3af36f08e07bf97 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 16:01:05 +0200 Subject: [PATCH 26/28] Adapt to new "appImageOptions" --- jabkit/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jabkit/build.gradle.kts b/jabkit/build.gradle.kts index 4035c06acd4..2bc560b53a1 100644 --- a/jabkit/build.gradle.kts +++ b/jabkit/build.gradle.kts @@ -81,7 +81,7 @@ javaModulePackaging { // All targets have to have "app-image" as sole target, since we do not distribute an installer targetsWithOs("windows") { - options.addAll("--win-console") + appImageOptions.addAll("--win-console") packageTypes = listOf("app-image") } targetsWithOs("linux") { From 4ace5e101ae4c35f9c66e6c7a3fab81cfac3b470 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 30 Jun 2025 16:01:19 +0200 Subject: [PATCH 27/28] Port changes to jabsrv-cli, too --- jabsrv-cli/build.gradle.kts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/jabsrv-cli/build.gradle.kts b/jabsrv-cli/build.gradle.kts index 275366c302d..58317edbd3d 100644 --- a/jabsrv-cli/build.gradle.kts +++ b/jabsrv-cli/build.gradle.kts @@ -113,15 +113,19 @@ tasks.named("run") { javaModulePackaging { applicationName = "jabsrv" vendor = "JabRef" + + // All targets have to have "app-image" as sole target, since we do not distribute an installer targetsWithOs("windows") { - // Error: Option [--win-console] is not valid with type [msi] - // options.addAll( - // "--win-console" - // ) + appImageOptions.addAll("--win-console") + packageTypes = listOf("app-image") } targetsWithOs("linux") { options.addAll( "--icon", "$projectDir/../jabgui/src/main/resources/icons/JabRef-linux-icon-64.png", ) + packageTypes = listOf("app-image") + } + targetsWithOs("macos") { + packageTypes = listOf("app-image") } } From 6acd2c8fbcce09dc49e86337088fcf0bfbd19fa3 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 1 Jul 2025 09:29:47 +0200 Subject: [PATCH 28/28] Delete jablib/src/main/java/org/jabref/logic/preferences/PreviewPreferences.java --- .../logic/preferences/PreviewPreferences.java | 127 ------------------ 1 file changed, 127 deletions(-) delete mode 100644 jablib/src/main/java/org/jabref/logic/preferences/PreviewPreferences.java diff --git a/jablib/src/main/java/org/jabref/logic/preferences/PreviewPreferences.java b/jablib/src/main/java/org/jabref/logic/preferences/PreviewPreferences.java deleted file mode 100644 index f8ae32d569e..00000000000 --- a/jablib/src/main/java/org/jabref/logic/preferences/PreviewPreferences.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.jabref.logic.preferences; - -import java.nio.file.Path; -import java.util.List; - -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.IntegerProperty; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleIntegerProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; - -import org.jabref.logic.layout.TextBasedPreviewLayout; -import org.jabref.logic.preview.PreviewLayout; - -public class PreviewPreferences { - - private final ObservableList layoutCycle; - private final IntegerProperty layoutCyclePosition; - private final ObjectProperty customPreviewLayout; - private final StringProperty defaultCustomPreviewLayout; - private final BooleanProperty showPreviewAsExtraTab; - private final BooleanProperty showPreviewEntryTableTooltip; - private final ObservableList bstPreviewLayoutPaths; - - public PreviewPreferences(List layoutCycle, - int layoutCyclePosition, - TextBasedPreviewLayout customPreviewLayout, - String defaultCustomPreviewLayout, - boolean showPreviewAsExtraTab, - boolean showPreviewEntryTableTooltip, - List bstPreviewLayoutPaths) { - this.layoutCycle = FXCollections.observableArrayList(layoutCycle); - this.layoutCyclePosition = new SimpleIntegerProperty(layoutCyclePosition); - this.customPreviewLayout = new SimpleObjectProperty<>(customPreviewLayout); - this.defaultCustomPreviewLayout = new SimpleStringProperty(defaultCustomPreviewLayout); - this.showPreviewAsExtraTab = new SimpleBooleanProperty(showPreviewAsExtraTab); - this.showPreviewEntryTableTooltip = new SimpleBooleanProperty(showPreviewEntryTableTooltip); - this.bstPreviewLayoutPaths = FXCollections.observableList(bstPreviewLayoutPaths); - } - - public ObservableList getLayoutCycle() { - return layoutCycle; - } - - public int getLayoutCyclePosition() { - return layoutCyclePosition.getValue(); - } - - public IntegerProperty layoutCyclePositionProperty() { - return layoutCyclePosition; - } - - public void setLayoutCyclePosition(int position) { - if (layoutCycle.isEmpty()) { - this.layoutCyclePosition.setValue(0); - } else { - int previewCyclePosition = position; - while (previewCyclePosition < 0) { - previewCyclePosition += layoutCycle.size(); - } - this.layoutCyclePosition.setValue(previewCyclePosition % layoutCycle.size()); - } - } - - public PreviewLayout getSelectedPreviewLayout() { - if (layoutCycle.size() <= 0 - || layoutCyclePosition.getValue() < 0 - || layoutCyclePosition.getValue() >= layoutCycle.size()) { - return getCustomPreviewLayout(); - } else { - return layoutCycle.get(layoutCyclePosition.getValue()); - } - } - - public TextBasedPreviewLayout getCustomPreviewLayout() { - return customPreviewLayout.getValue(); - } - - public ObjectProperty customPreviewLayoutProperty() { - return customPreviewLayout; - } - - public void setCustomPreviewLayout(TextBasedPreviewLayout layout) { - this.customPreviewLayout.set(layout); - } - - public String getDefaultCustomPreviewLayout() { - return defaultCustomPreviewLayout.getValue(); - } - - public boolean shouldShowPreviewAsExtraTab() { - return showPreviewAsExtraTab.getValue(); - } - - public void setShowPreviewAsExtraTab(boolean showPreviewAsExtraTab) { - this.showPreviewAsExtraTab.set(showPreviewAsExtraTab); - } - - public BooleanProperty showPreviewAsExtraTabProperty() { - return showPreviewAsExtraTab; - } - - public boolean shouldShowPreviewEntryTableTooltip() { - return showPreviewEntryTableTooltip.getValue(); - } - - public void setShowPreviewEntryTableTooltip(boolean showPreviewEntryTableTooltip) { - this.showPreviewEntryTableTooltip.set(showPreviewEntryTableTooltip); - } - - public BooleanProperty showPreviewEntryTableTooltip() { - return showPreviewEntryTableTooltip; - } - - public ObservableList getBstPreviewLayoutPaths() { - return bstPreviewLayoutPaths; - } - - public void setBstPreviewLayoutPaths(List bstPreviewLayoutPaths) { - this.bstPreviewLayoutPaths.setAll(bstPreviewLayoutPaths); - } -}