diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..505ccc1c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,22 @@ +version: 2 +updates: + - package-ecosystem: "maven" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "06:00" + timezone: "UTC" + groups: + maven-dependencies: + patterns: + - "*" + + - package-ecosystem: "github-actions" + directory: "/" # even for `.github/workflows` + schedule: + interval: "monthly" + groups: + github-actions: + patterns: + - "*" \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6b932ef4..b7c29993 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,10 +9,10 @@ jobs: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-java@v3 with: - java-version: 21-ea + java-version: 21 distribution: 'zulu' cache: 'maven' - name: Setup fuse @@ -32,10 +32,10 @@ jobs: runs-on: macos-12 if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-java@v3 with: - java-version: 21-ea + java-version: 21 distribution: 'zulu' cache: 'maven' - name: Setup fuse @@ -56,10 +56,10 @@ jobs: runs-on: windows-latest if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-java@v3 with: - java-version: 21-ea + java-version: 21 distribution: 'zulu' cache: 'maven' - name: Setup fuse @@ -78,12 +78,12 @@ jobs: needs: [linux-amd64, mac, win] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-java@v3 with: - java-version: 21-ea + java-version: 21 distribution: 'zulu' cache: 'maven' - name: Cache SonarCloud packages diff --git a/.github/workflows/publish-central.yml b/.github/workflows/publish-central.yml index 1f285408..8d568d99 100644 --- a/.github/workflows/publish-central.yml +++ b/.github/workflows/publish-central.yml @@ -10,12 +10,12 @@ jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: "refs/tags/${{ github.event.inputs.tag }}" - uses: actions/setup-java@v3 with: - java-version: 21-ea + java-version: 21 distribution: 'zulu' cache: 'maven' server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml diff --git a/.github/workflows/publish-github.yml b/.github/workflows/publish-github.yml index d28dbb31..c510a226 100644 --- a/.github/workflows/publish-github.yml +++ b/.github/workflows/publish-github.yml @@ -7,10 +7,10 @@ jobs: runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') # only allow publishing tagged versions steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-java@v3 with: - java-version: 21-ea + java-version: 21 distribution: 'zulu' cache: 'maven' gpg-private-key: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }} # Value of the GPG private key to import diff --git a/.idea/misc.xml b/.idea/misc.xml index fe432516..ee700a1c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/README.md b/README.md index b55786c7..b5841ca4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ # jFUSE -Zero-Dependency Java bindings for FUSE using [JEP 4442](https://openjdk.org/jeps/442). +Zero-Dependency Java bindings for FUSE using [JEP 442](https://openjdk.org/jeps/442). ## Status diff --git a/jfuse-api/pom.xml b/jfuse-api/pom.xml index b8689d32..fbc7e93a 100644 --- a/jfuse-api/pom.xml +++ b/jfuse-api/pom.xml @@ -5,7 +5,7 @@ org.cryptomator jfuse-parent - 0.6.1 + 0.6.2 4.0.0 jfuse-api diff --git a/jfuse-examples/pom.xml b/jfuse-examples/pom.xml index 6c5d34f6..436493d6 100644 --- a/jfuse-examples/pom.xml +++ b/jfuse-examples/pom.xml @@ -5,7 +5,7 @@ org.cryptomator jfuse-parent - 0.6.1 + 0.6.2 4.0.0 jfuse-examples @@ -24,7 +24,7 @@ org.slf4j slf4j-simple - 2.0.3 + 2.0.9 diff --git a/jfuse-linux-aarch64/pom.xml b/jfuse-linux-aarch64/pom.xml index f867bcf6..8f0c896d 100644 --- a/jfuse-linux-aarch64/pom.xml +++ b/jfuse-linux-aarch64/pom.xml @@ -5,7 +5,7 @@ jfuse-parent org.cryptomator - 0.6.1 + 0.6.2 4.0.0 jfuse-linux-aarch64 diff --git a/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/LinuxFuseBuilder.java b/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/LinuxFuseBuilder.java index 11842b17..c76abf3f 100644 --- a/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/LinuxFuseBuilder.java +++ b/jfuse-linux-aarch64/src/main/java/org/cryptomator/jfuse/linux/aarch64/LinuxFuseBuilder.java @@ -14,7 +14,7 @@ @SupportedPlatform(os = OperatingSystem.LINUX, arch = Architecture.ARM64) public class LinuxFuseBuilder implements FuseBuilder { - private static final String DEFAULT_LIB_PATH = "/lib/aarch64-linux-gnu/libfuse3.so.3"; + private static final String DEFAULT_LIBNAME = "fuse3"; private static final Errno ERRNO = new LinuxErrno(); private String libraryPath; @@ -39,7 +39,7 @@ public Fuse build(FuseOperations fuseOperations) throws UnsatisfiedLinkError { if (libraryPath != null) { System.load(libraryPath); } else { - System.load(DEFAULT_LIB_PATH); + System.loadLibrary(DEFAULT_LIBNAME); } return new FuseImpl(fuseOperations); } diff --git a/jfuse-linux-amd64/pom.xml b/jfuse-linux-amd64/pom.xml index 88799919..a21062a0 100644 --- a/jfuse-linux-amd64/pom.xml +++ b/jfuse-linux-amd64/pom.xml @@ -5,7 +5,7 @@ org.cryptomator jfuse-parent - 0.6.1 + 0.6.2 4.0.0 jfuse-linux-amd64 diff --git a/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/LinuxFuseBuilder.java b/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/LinuxFuseBuilder.java index 24ef1284..bdfebc18 100644 --- a/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/LinuxFuseBuilder.java +++ b/jfuse-linux-amd64/src/main/java/org/cryptomator/jfuse/linux/amd64/LinuxFuseBuilder.java @@ -14,7 +14,7 @@ @SupportedPlatform(os = OperatingSystem.LINUX, arch = Architecture.AMD64) public class LinuxFuseBuilder implements FuseBuilder { - private static final String DEFAULT_LIB_PATH = "/lib/x86_64-linux-gnu/libfuse3.so.3"; + private static final String DEFAULT_LIBNAME = "fuse3"; private static final Errno ERRNO = new LinuxErrno(); private String libraryPath; @@ -39,7 +39,7 @@ public Fuse build(FuseOperations fuseOperations) throws UnsatisfiedLinkError { if (libraryPath != null) { System.load(libraryPath); } else { - System.load(DEFAULT_LIB_PATH); + System.loadLibrary(DEFAULT_LIBNAME); } return new FuseImpl(fuseOperations); } diff --git a/jfuse-mac/pom.xml b/jfuse-mac/pom.xml index 0f735887..38a0b02e 100644 --- a/jfuse-mac/pom.xml +++ b/jfuse-mac/pom.xml @@ -5,7 +5,7 @@ org.cryptomator jfuse-parent - 0.6.1 + 0.6.2 4.0.0 jfuse-mac diff --git a/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/MacFuseBuilder.java b/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/MacFuseBuilder.java index e78c04cb..b9304eb8 100644 --- a/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/MacFuseBuilder.java +++ b/jfuse-mac/src/main/java/org/cryptomator/jfuse/mac/MacFuseBuilder.java @@ -8,9 +8,6 @@ import org.cryptomator.jfuse.api.platforms.OperatingSystem; import org.cryptomator.jfuse.api.platforms.SupportedPlatform; -import java.nio.file.Files; -import java.nio.file.Path; - /** * Builds FUSE file system instances on macOS. */ @@ -18,8 +15,8 @@ @SupportedPlatform(os = OperatingSystem.MAC, arch = Architecture.ARM64) public class MacFuseBuilder implements FuseBuilder { - private static final String DEFAULT_MACFUSE_PATH = "/usr/local/lib/libfuse.dylib"; - private static final String DEFAULT_FUSET_PATH = "/usr/local/lib/libfuse-t.dylib"; + private static final String DEFAULT_MACFUSE_LIBNAME = "fuse"; + private static final String DEFAULT_FUSET_LIBNAMNE = "fuse-t"; private static final Errno ERRNO = new MacErrno(); private String libraryPath; @@ -43,12 +40,17 @@ public void setLibraryPath(String libraryPath) { public Fuse build(FuseOperations fuseOperations) throws UnsatisfiedLinkError { if (libraryPath != null) { System.load(libraryPath); - } else if (Files.exists(Path.of(DEFAULT_MACFUSE_PATH))) { - System.load(DEFAULT_MACFUSE_PATH); - } else if (Files.exists(Path.of(DEFAULT_FUSET_PATH))) { - System.load(DEFAULT_FUSET_PATH); } else { - System.loadLibrary("fuse"); + try { + System.loadLibrary(DEFAULT_MACFUSE_LIBNAME); + } catch (UnsatisfiedLinkError errorLoadingMacFuse) { + try { + System.loadLibrary(DEFAULT_FUSET_LIBNAMNE); + } catch (UnsatisfiedLinkError errorLoadingFuseT) { + errorLoadingFuseT.addSuppressed(errorLoadingMacFuse); + throw errorLoadingFuseT; + } + } } return new FuseImpl(fuseOperations); } diff --git a/jfuse-tests/pom.xml b/jfuse-tests/pom.xml index 4de6fd66..40528870 100644 --- a/jfuse-tests/pom.xml +++ b/jfuse-tests/pom.xml @@ -5,7 +5,7 @@ org.cryptomator jfuse-parent - 0.6.1 + 0.6.2 4.0.0 jfuse-tests @@ -58,19 +58,19 @@ org.slf4j slf4j-simple - 2.0.3 + 2.0.9 test org.openjdk.jmh jmh-core - 1.35 + 1.37 test org.openjdk.jmh jmh-generator-annprocess - 1.35 + 1.37 test @@ -81,10 +81,10 @@ org.apache.maven.plugins maven-surefire-plugin - @{surefire.jacoco.args} --enable-native-access=ALL-UNNAMED --enable-preview - + @{surefire.jacoco.args} --enable-native-access=ALL-UNNAMED --enable-preview -Djava.library.path=".:${java.library.path}" + ${fuse.lib.path} - + @@ -100,10 +100,10 @@ **/*IT.java - @{failsafe.jacoco.args} --enable-native-access=ALL-UNNAMED --enable-preview - + @{failsafe.jacoco.args} --enable-native-access=ALL-UNNAMED --enable-preview -Djava.library.path=".:${java.library.path}" + ${fuse.lib.path} - + diff --git a/jfuse-tests/src/test/java/org/cryptomator/jfuse/tests/FallbackLibLoadingIT.java b/jfuse-tests/src/test/java/org/cryptomator/jfuse/tests/FallbackLibLoadingIT.java new file mode 100644 index 00000000..e0c71b34 --- /dev/null +++ b/jfuse-tests/src/test/java/org/cryptomator/jfuse/tests/FallbackLibLoadingIT.java @@ -0,0 +1,47 @@ +package org.cryptomator.jfuse.tests; + +import org.cryptomator.jfuse.api.Fuse; +import org.cryptomator.jfuse.examples.RandomFileSystem; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIfSystemProperty; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.io.TempDir; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.concurrent.TimeoutException; + +@EnabledIfSystemProperty(named = "fuse.lib.path", matches = ".+") +public class FallbackLibLoadingIT { + + @Test + @EnabledOnOs(OS.LINUX) + @DisplayName("loads fuse lib from java.library.path, if not calling FuseBuilder.setLibraryPath(...)") + public void loadFromJavaLibraryPathOnLinux() throws IOException, TimeoutException { + loadFromJavaLibraryPath("libfuse3.so"); + } + + @Test + @EnabledOnOs(OS.MAC) + @DisplayName("loads fuse lib from java.library.path, if not calling FuseBuilder.setLibraryPath(...)") + public void loadFromJavaLibraryPathOnMacOS() throws IOException, TimeoutException { + loadFromJavaLibraryPath("libfuse-t.dylib"); + } + + private void loadFromJavaLibraryPath(String libFileName) throws IOException, TimeoutException { + // symlink ./${libName} -> ${fuse.lib.path} + var symlinkPath = Path.of(System.getProperty("user.dir"), libFileName); + Files.createSymbolicLink(symlinkPath, Path.of(System.getProperty("fuse.lib.path"))); + + var builder = Fuse.builder(); + var fs = new RandomFileSystem(builder.errno()); + var fuse = Assertions.assertDoesNotThrow(() -> builder.build(fs)); + fuse.close(); + } + +} diff --git a/jfuse-win/pom.xml b/jfuse-win/pom.xml index 11d2237a..2921aace 100644 --- a/jfuse-win/pom.xml +++ b/jfuse-win/pom.xml @@ -5,7 +5,7 @@ org.cryptomator jfuse-parent - 0.6.1 + 0.6.2 4.0.0 jfuse-win diff --git a/jfuse/pom.xml b/jfuse/pom.xml index 7c2ed4d7..4760d518 100644 --- a/jfuse/pom.xml +++ b/jfuse/pom.xml @@ -5,7 +5,7 @@ org.cryptomator jfuse-parent - 0.6.1 + 0.6.2 4.0.0 jfuse diff --git a/pom.xml b/pom.xml index e9beff42..3b70e9c2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.cryptomator jfuse-parent pom - 0.6.1 + 0.6.2 jFUSE Java bindings for FUSE using foreign functions & memory API https://github.com/cryptomator/jfuse @@ -54,19 +54,19 @@ org.jetbrains annotations - 23.0.0 + 24.0.1 provided org.junit.jupiter junit-jupiter - 5.9.0 + 5.10.0 test org.mockito mockito-core - 5.4.0 + 5.5.0 test @@ -77,7 +77,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.10.1 + 3.11.0 21 UTF-8 @@ -90,17 +90,17 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.1.0 + 3.4.1 org.apache.maven.plugins maven-clean-plugin - 3.2.0 + 3.3.1 org.apache.maven.plugins maven-gpg-plugin - 3.0.1 + 3.1.0 org.apache.maven.plugins @@ -110,22 +110,22 @@ org.apache.maven.plugins maven-source-plugin - 3.2.1 + 3.3.0 org.apache.maven.plugins maven-javadoc-plugin - 3.4.1 + 3.6.0 org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M7 + 3.1.2 org.apache.maven.plugins maven-failsafe-plugin - 3.0.0-M7 + 3.1.2 org.sonatype.plugins @@ -135,12 +135,12 @@ org.apache.maven.plugins maven-deploy-plugin - 3.0.0-M2 + 3.1.1 org.jacoco jacoco-maven-plugin - 0.8.9 + 0.8.10