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..72f1143440a 100644 --- a/.github/workflows/binaries.yml +++ b/.github/workflows/binaries.yml @@ -138,28 +138,32 @@ 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/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/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/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/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/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/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 (ARM64) + 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' archForDebianRepack: '' runs-on: ${{ matrix.os }} @@ -175,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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - name: Install pigz and cache (linux) if: (startsWith(matrix.os, 'ubuntu')) uses: awalsh128/cache-apt-pkgs-action@latest @@ -212,13 +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: 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 @@ -234,125 +237,23 @@ 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/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 \ - --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/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 \ - --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 - 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') }} + - 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 ${{ 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"} + 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 }}"} - 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 @@ -365,11 +266,7 @@ jobs: - 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') }} + - name: Package JabKit application image shell: bash run: | set -e @@ -409,23 +306,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/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/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/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/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/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/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/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 @@ -433,8 +330,8 @@ jobs: # tbn = to-be-notarized name: JabRef-${{ matrix.os }}-tbn path: | - jabgui/build/distribution - jabkit/build/distribution + jabgui/build/packages/${{ matrix.os }} + jabkit/build/packages/${{ matrix.os }} compression-level: 0 # no compression # endregion @@ -481,18 +378,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 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/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 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/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/packages/${{ matrix.os }}/ 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 6d4c3c69322..28d48eb89de 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -330,6 +396,12 @@ jobs: jbang- - name: Setup JBang uses: jbangdev/setup-jbang@main + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - run: jbang build .jbang/CheckoutPR.java - run: jbang build .jbang/CloneJabRef.java - run: jbang build .jbang/JabKitLauncher.java @@ -371,6 +443,12 @@ jobs: with: submodules: 'true' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - name: Set up JDK if: github.ref == 'refs/heads/main' uses: actions/setup-java@v4 @@ -403,6 +481,12 @@ jobs: - uses: actions/checkout@v4 with: show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - name: Set up JDK uses: actions/setup-java@v4 with: @@ -423,6 +507,12 @@ jobs: - uses: actions/checkout@v4 with: show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - uses: gradle/actions/wrapper-validation@v4 mandatory-checks-section-exists: @@ -444,6 +534,12 @@ jobs: with: submodules: 'false' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - name: Check for existence of Mandatory Checks section id: check_mandatory_section @@ -480,6 +576,12 @@ jobs: with: submodules: 'false' show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - name: Check for PR checklist id: check_changelog_modification run: | @@ -523,6 +625,12 @@ jobs: - uses: actions/checkout@v4 with: show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - name: Merge Conflict finder uses: olivernybroe/action-conflict-finder@v4.1 @@ -534,6 +642,12 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - name: Check force push id: force_push_check run: | @@ -558,6 +672,12 @@ jobs: with: submodules: true show-progress: 'false' + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - name: Check for submodule modifications id: check_submodule run: | @@ -608,6 +728,12 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Checkout java-module-packaging + uses: actions/checkout@v4 + with: + repository: koppor/java-module-packaging + path: build-logic/java-module-packaging + ref: fix-params - 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..6f66fcb7ce0 --- /dev/null +++ b/build-logic/.gitignore @@ -0,0 +1 @@ +java-module-packaging diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 5f0e4f73d83..8e43499008b 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.19.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..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 @@ -1,54 +1,45 @@ -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 - 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", "pkg") + singleStepPackaging = true } target("macos-14") { operatingSystem = OperatingSystemFamily.MACOS architecture = MachineArchitecture.ARM64 - packageTypes = listOf("dmg") + packageTypes = listOf("app-image", "dmg", "pkg") + singleStepPackaging = true } - target("windows-2022") { + target("windows-latest") { operatingSystem = OperatingSystemFamily.WINDOWS architecture = MachineArchitecture.X86_64 - packageTypes = listOf("exe") + packageTypes = listOf("app-image", "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/gradle.properties b/gradle.properties index 25870ec2e93..ac89e516163 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,16 +5,10 @@ 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 - +# Blocked by https://github.com/jbangdev/jbang-gradle-plugin/issues/7 +org.gradle.configuration-cache=false # 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 diff --git a/jabgui/build.gradle.kts b/jabgui/build.gradle.kts index 6c7d221d506..b8c43c14825 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,123 @@ 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", + + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseCompactObjectHeaders", + "-XX:+UseZGC", + "-XX:+ZUncommit", + "-XX:+UseStringDeduplication" ) } -/* -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", + "--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/**") + }) } } 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 00000000000..e231e8d3bad Binary files /dev/null and b/jabgui/buildres/macos/launcher.icns differ diff --git a/jabgui/buildres/mac/postinstall b/jabgui/buildres/macos/postinstall similarity index 100% rename from jabgui/buildres/mac/postinstall rename to jabgui/buildres/macos/postinstall diff --git a/jabgui/buildres/windows/jabref.ico b/jabgui/buildres/windows/jabref.ico new file mode 100644 index 00000000000..2e33c5a0e45 Binary files /dev/null and b/jabgui/buildres/windows/jabref.ico differ 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..2bc560b53a1 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,17 +58,11 @@ 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") - // 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", @@ -83,120 +75,22 @@ 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" +javaModulePackaging { + applicationName = "jabkit" + addModules.add("jdk.incubator.vector") - // 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" + // All targets have to have "app-image" as sole target, since we do not distribute an installer + targetsWithOs("windows") { + appImageOptions.addAll("--win-console") + packageTypes = listOf("app-image") } - - // 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") - + targetsWithOs("linux") { + options.addAll( + "--icon", "$projectDir/../jabgui/src/main/resources/icons/JabRef-linux-icon-64.png", + ) + packageTypes = listOf("app-image") } - 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("macos") { + packageTypes = listOf("app-image") } } 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/jabsrv-cli/build.gradle.kts b/jabsrv-cli/build.gradle.kts index 2ef336f4d09..58317edbd3d 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,22 @@ 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" +javaModulePackaging { + applicationName = "jabsrv" + vendor = "JabRef" - // 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" + // All targets have to have "app-image" as sole target, since we do not distribute an installer + targetsWithOs("windows") { + appImageOptions.addAll("--win-console") + packageTypes = listOf("app-image") } - - // 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") - + targetsWithOs("linux") { + options.addAll( + "--icon", "$projectDir/../jabgui/src/main/resources/icons/JabRef-linux-icon-64.png", + ) + packageTypes = listOf("app-image") } - 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("macos") { + packageTypes = listOf("app-image") } } 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 4e19f34ef30..15e3f8ae314 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,14 +107,16 @@ 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") + api("org.jetbrains:annotations:26.0.2") api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.0") api("org.jooq:jool:0.9.15") api("org.jsoup:jsoup:1.20.1") @@ -127,17 +130,18 @@ dependencies.constraints { api("org.libreoffice:libreoffice:24.8.4") api("org.libreoffice:unoloader:24.8.4") api("org.mockito:mockito-core:5.18.0") + api("org.ow2.asm:asm:9.6") api("org.postgresql:postgresql:42.7.7") 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") }