diff --git a/.github/workflows/test-graalvm-metadata.yml b/.github/workflows/test-graalvm-metadata.yml index 3b0afa41d..edb52c224 100644 --- a/.github/workflows/test-graalvm-metadata.yml +++ b/.github/workflows/test-graalvm-metadata.yml @@ -3,12 +3,12 @@ name: "Test GraalVM Reachability Metadata Repository" on: push: paths: - - 'common/jvm-reachability-metadata/**' + - 'common/graalvm-reachability-metadata/**' - '.github/actions/prepare-environment' - '.github/workflows/test-graalvm-metadata.yml' pull_request: paths: - - 'common/jvm-reachability-metadata/**' + - 'common/graalvm-reachability-metadata/**' - '.github/actions/prepare-environment' - '.github/workflows/test-graalvm-metadata.yml' workflow_dispatch: @@ -37,12 +37,12 @@ jobs: java-version: ${{ matrix.java-version }} github-token: ${{ secrets.GITHUB_TOKEN }} - name: "❓ Checkstyle" - run: ./gradlew :jvm-reachability-metadata:checkstyleMain :jvm-reachability-metadata:checkstyleTest + run: ./gradlew :graalvm-reachability-metadata:checkstyleMain :graalvm-reachability-metadata:checkstyleTest - name: "❓ GraalVM Reachability Metadata test" - run: ./gradlew :jvm-reachability-metadata:test + run: ./gradlew :graalvm-reachability-metadata:test - name: "📜 Upload tests results" if: always() uses: actions/upload-artifact@v2 with: name: tests-results - path: common/jvm-reachability-metadata/build/reports/tests/ + path: common/graalvm-reachability-metadata/build/reports/tests/ diff --git a/common/jvm-reachability-metadata/LICENSE b/common/graalvm-reachability-metadata/LICENSE similarity index 100% rename from common/jvm-reachability-metadata/LICENSE rename to common/graalvm-reachability-metadata/LICENSE diff --git a/common/jvm-reachability-metadata/build.gradle.kts b/common/graalvm-reachability-metadata/build.gradle.kts similarity index 100% rename from common/jvm-reachability-metadata/build.gradle.kts rename to common/graalvm-reachability-metadata/build.gradle.kts diff --git a/common/jvm-reachability-metadata/gradle/native-image-testing.gradle b/common/graalvm-reachability-metadata/gradle/native-image-testing.gradle similarity index 100% rename from common/jvm-reachability-metadata/gradle/native-image-testing.gradle rename to common/graalvm-reachability-metadata/gradle/native-image-testing.gradle diff --git a/common/jvm-reachability-metadata/gradle/wrapper/gradle-wrapper.jar b/common/graalvm-reachability-metadata/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from common/jvm-reachability-metadata/gradle/wrapper/gradle-wrapper.jar rename to common/graalvm-reachability-metadata/gradle/wrapper/gradle-wrapper.jar diff --git a/common/jvm-reachability-metadata/gradle/wrapper/gradle-wrapper.properties b/common/graalvm-reachability-metadata/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from common/jvm-reachability-metadata/gradle/wrapper/gradle-wrapper.properties rename to common/graalvm-reachability-metadata/gradle/wrapper/gradle-wrapper.properties diff --git a/common/jvm-reachability-metadata/gradlew b/common/graalvm-reachability-metadata/gradlew similarity index 100% rename from common/jvm-reachability-metadata/gradlew rename to common/graalvm-reachability-metadata/gradlew diff --git a/common/jvm-reachability-metadata/gradlew.bat b/common/graalvm-reachability-metadata/gradlew.bat similarity index 100% rename from common/jvm-reachability-metadata/gradlew.bat rename to common/graalvm-reachability-metadata/gradlew.bat diff --git a/common/jvm-reachability-metadata/settings.gradle.kts b/common/graalvm-reachability-metadata/settings.gradle.kts similarity index 97% rename from common/jvm-reachability-metadata/settings.gradle.kts rename to common/graalvm-reachability-metadata/settings.gradle.kts index 39c0f4fe5..19ce0fb57 100644 --- a/common/jvm-reachability-metadata/settings.gradle.kts +++ b/common/graalvm-reachability-metadata/settings.gradle.kts @@ -48,4 +48,4 @@ plugins { id("org.graalvm.build.common") } -rootProject.name = "jvm-reachability-metadata" +rootProject.name = "graalvm-reachability-metadata" diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/GraalVMReachabilityMetadataRepository.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/GraalVMReachabilityMetadataRepository.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/GraalVMReachabilityMetadataRepository.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/GraalVMReachabilityMetadataRepository.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/Query.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/Query.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/Query.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/Query.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/DefaultArtifactQuery.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/DefaultArtifactQuery.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/DefaultArtifactQuery.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/DefaultArtifactQuery.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/DefaultQuery.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/DefaultQuery.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/DefaultQuery.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/DefaultQuery.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java similarity index 94% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java index e74b436d5..76dc0e26f 100644 --- a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java +++ b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java @@ -73,9 +73,20 @@ public FileSystemRepository(Path rootDirectory, Logger logger) { this.rootDirectory = rootDirectory; } - public static boolean isSupportedArchiveFormat(String path) { + private static final String[] SUPPORTED_FORMATS = {".zip", ".tar.gz", ".tar.bz2"}; + + public static String getArchiveFormat(String path) { String normalizedPath = path.toLowerCase(); - return normalizedPath.endsWith(".zip") || normalizedPath.endsWith(".tar.gz") || normalizedPath.endsWith(".tar.bz2"); + for (String format : SUPPORTED_FORMATS) { + if (normalizedPath.endsWith(format)) { + return format; + } + } + return null; + } + + public static boolean isSupportedArchiveFormat(String path) { + return getArchiveFormat(path) != null; } @Override diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/UncheckedIOException.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/UncheckedIOException.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/UncheckedIOException.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/UncheckedIOException.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/Artifact.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/Artifact.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/Artifact.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/Artifact.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndex.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndex.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndex.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndex.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/VersionToConfigDirectoryIndex.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/VersionToConfigDirectoryIndex.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/VersionToConfigDirectoryIndex.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/artifacts/VersionToConfigDirectoryIndex.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndex.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndex.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndex.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndex.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndex.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndex.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndex.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndex.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/ModuleEntry.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/ModuleEntry.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/ModuleEntry.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/ModuleEntry.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/ModuleToConfigDirectoryIndex.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/ModuleToConfigDirectoryIndex.java similarity index 100% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/ModuleToConfigDirectoryIndex.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/ModuleToConfigDirectoryIndex.java diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndex.java b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndex.java similarity index 96% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndex.java rename to common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndex.java index d8d8a82a0..d93330f14 100644 --- a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndex.java +++ b/common/graalvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndex.java @@ -54,7 +54,7 @@ public StandardLocationModuleToConfigDirectoryIndex(Path rootPath) { @Override public Set findConfigurationDirectories(String groupId, String artifactId) { - Path candidate = rootPath.resolve(groupId.replace('.', '/') + "/" + artifactId); + Path candidate = rootPath.resolve(groupId + "/" + artifactId); if (Files.isDirectory(candidate)) { return Collections.singleton(candidate); } diff --git a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/FileSystemRepositoryTest.java b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/FileSystemRepositoryTest.java similarity index 94% rename from common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/FileSystemRepositoryTest.java rename to common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/FileSystemRepositoryTest.java index 60ac40d20..65c663116 100644 --- a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/FileSystemRepositoryTest.java +++ b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/FileSystemRepositoryTest.java @@ -64,13 +64,13 @@ void testRepo1() { lookup("org:foo:1.0"); // then: - result.hasSinglePath("org/foo/1"); + result.hasSinglePath("org/foo/1.0"); // when: lookup("org:foo:1.1"); // then: - result.hasSinglePath("org/foo/2"); + result.hasSinglePath("org/foo/1.1"); // when: lookup("org:foo:1.2"); @@ -86,7 +86,7 @@ void testRepo2() { lookup("org:bar:2.1"); // then: - result.hasSinglePath("org/foo/2"); + result.hasSinglePath("org/foo/1.1"); } @Test @@ -99,7 +99,7 @@ void canDefaultToLatestConfigDir() { }); // then: - result.hasSinglePath("org/foo/2"); + result.hasSinglePath("org/foo/1.1"); //when: "order of spec shouldn't matter" lookup(q -> { @@ -108,7 +108,7 @@ void canDefaultToLatestConfigDir() { }); // then: - result.hasSinglePath("org/foo/2"); + result.hasSinglePath("org/foo/1.1"); } @Test @@ -118,11 +118,11 @@ void canForceToParticularConfigVersion() { lookup(q -> q.forArtifact(artifact -> { artifact.gav("org:foo:1.2"); - artifact.forceConfigVersion("1"); + artifact.forceConfigVersion("1.0"); })); // then: - result.hasSinglePath("org/foo/1"); + result.hasSinglePath("org/foo/1.0"); } @Test @@ -149,7 +149,7 @@ void canUseLatestConfigDir() { })); // then: - result.hasSinglePath("org/foo/2"); + result.hasSinglePath("org/foo/1.1"); // when: lookup(q -> { diff --git a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndexTest.java b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndexTest.java similarity index 92% rename from common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndexTest.java rename to common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndexTest.java index 38f806e21..4cf3384e3 100644 --- a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndexTest.java +++ b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/artifacts/SingleModuleJsonVersionToConfigDirectoryIndexTest.java @@ -63,29 +63,29 @@ void checkIndex() throws URISyntaxException { Optional configDir = index.findConfigurationDirectory("com.foo", "bar", "1.0"); assertTrue(configDir.isPresent()); - assertEquals(repoPath.resolve("1"), configDir.get()); + assertEquals(repoPath.resolve("1.0"), configDir.get()); configDir = index.findConfigurationDirectory("com.foo", "bar", "1.3"); assertTrue(configDir.isPresent()); - assertEquals(repoPath.resolve("1"), configDir.get()); + assertEquals(repoPath.resolve("1.0"), configDir.get()); configDir = index.findConfigurationDirectory("com.foo", "bar", "2.0"); assertTrue(configDir.isPresent()); - assertEquals(repoPath.resolve("2"), configDir.get()); + assertEquals(repoPath.resolve("2.0"), configDir.get()); configDir = index.findConfigurationDirectory("com.foo", "bar", "2.5"); assertFalse(configDir.isPresent()); configDir = index.findConfigurationDirectory("com.foo", "bar-all", "2.0"); assertTrue(configDir.isPresent()); - assertEquals(repoPath.resolve("2"), configDir.get()); + assertEquals(repoPath.resolve("2.0"), configDir.get()); configDir = index.findConfigurationDirectory("com.foo", "nope", "1.0"); assertFalse(configDir.isPresent()); Optional latest = index.findLatestConfigurationFor("com.foo", "bar"); assertTrue(latest.isPresent()); - assertEquals(repoPath.resolve("2"), latest.get()); + assertEquals(repoPath.resolve("2.0"), latest.get()); } diff --git a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndexTest.java b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndexTest.java similarity index 95% rename from common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndexTest.java rename to common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndexTest.java index 11102b826..229d0bc11 100644 --- a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndexTest.java +++ b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/FileSystemModuleToConfigDirectoryIndexTest.java @@ -63,10 +63,10 @@ class FileSystemModuleToConfigDirectoryIndexTest { void returnsSingleDirectory() throws IOException, URISyntaxException { writeIndex("single-dir"); Set configurationDirectories = index.findConfigurationDirectories("io.netty", "netty-core"); - assertEquals(singleton(repoPath.resolve("io/netty/netty-core")), configurationDirectories); + assertEquals(singleton(repoPath.resolve("io.netty/netty-core")), configurationDirectories); configurationDirectories = index.findConfigurationDirectories("io.netty", "netty-all"); - assertEquals(singleton(repoPath.resolve("io/netty/netty-core")), configurationDirectories); + assertEquals(singleton(repoPath.resolve("io.netty/netty-core")), configurationDirectories); configurationDirectories = index.findConfigurationDirectories("org", "bar"); assertEquals(singleton(repoPath.resolve("org/bar")), configurationDirectories); @@ -77,7 +77,7 @@ void returnsMultipleDirectories() throws IOException, URISyntaxException { writeIndex("multi-dirs"); Set configurationDirectories = index.findConfigurationDirectories("io.netty", "netty-all"); assertEquals(new HashSet<>(asList( - repoPath.resolve("io/netty/netty-core"), + repoPath.resolve("io.netty/netty-core"), repoPath.resolve("jline") )), configurationDirectories); diff --git a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndexTest.java b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndexTest.java similarity index 95% rename from common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndexTest.java rename to common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndexTest.java index eca5987d8..c0d6f8380 100644 --- a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndexTest.java +++ b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/JsonModuleToConfigDirectoryIndexTest.java @@ -63,10 +63,10 @@ class JsonModuleToConfigDirectoryIndexTest { void returnsSingleDirectory() throws URISyntaxException { writeIndex("single-dir"); Set configurationDirectories = index.findConfigurationDirectories("io.netty", "netty-core"); - assertEquals(singleton(repoPath.resolve("io/netty/netty-core")), configurationDirectories); + assertEquals(singleton(repoPath.resolve("io.netty/netty-core")), configurationDirectories); configurationDirectories = index.findConfigurationDirectories("io.netty", "netty-all"); - assertEquals(singleton(repoPath.resolve("io/netty/netty-core")), configurationDirectories); + assertEquals(singleton(repoPath.resolve("io.netty/netty-core")), configurationDirectories); configurationDirectories = index.findConfigurationDirectories("org", "bar"); assertEquals(emptySet(), configurationDirectories); @@ -77,7 +77,7 @@ void returnsMultipleDirectories() throws URISyntaxException { writeIndex("multi-dirs"); Set configurationDirectories = index.findConfigurationDirectories("io.netty", "netty-all"); assertEquals(new HashSet<>(asList( - repoPath.resolve("io/netty/netty-core"), + repoPath.resolve("io.netty/netty-core"), repoPath.resolve("jline") )), configurationDirectories); diff --git a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndexTest.java b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndexTest.java similarity index 98% rename from common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndexTest.java rename to common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndexTest.java index 8b866066c..adcbeb65b 100644 --- a/common/jvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndexTest.java +++ b/common/graalvm-reachability-metadata/src/test/java/org/graalvm/reachability/internal/index/modules/StandardLocationModuleToConfigDirectoryIndexTest.java @@ -67,7 +67,7 @@ void setUp() { @Test void returnsConventionalConfigLocation() throws IOException { - Path localDir = tempDir.resolve("org/module/foo"); + Path localDir = tempDir.resolve("org.module/foo"); Files.createDirectories(localDir); Set configurationDirectories = index.findConfigurationDirectories("org.module", "foo"); assertEquals(singleton(localDir), configurationDirectories); diff --git a/common/jvm-reachability-metadata/src/test/resources/json/artifact-1/index.json b/common/graalvm-reachability-metadata/src/test/resources/json/artifact-1/index.json similarity index 62% rename from common/jvm-reachability-metadata/src/test/resources/json/artifact-1/index.json rename to common/graalvm-reachability-metadata/src/test/resources/json/artifact-1/index.json index ad650cfc3..63370f676 100644 --- a/common/jvm-reachability-metadata/src/test/resources/json/artifact-1/index.json +++ b/common/graalvm-reachability-metadata/src/test/resources/json/artifact-1/index.json @@ -1,5 +1,5 @@ [ - { "module": "com.foo:bar", "tested-versions": ["1.0", "1.1", "1.2", "1.3"], "metadata-version": "1" }, - { "module": "com.foo:bar", "tested-versions": ["2.0", "2.1"], "metadata-version": "2", "latest": true }, - { "module": "com.foo:bar-all", "tested-versions": ["2.0", "2.1"], "metadata-version": "2" } + { "module": "com.foo:bar", "tested-versions": ["1.0", "1.1", "1.2", "1.3"], "metadata-version": "1.0" }, + { "module": "com.foo:bar", "tested-versions": ["2.0", "2.1"], "metadata-version": "2.0", "latest": true }, + { "module": "com.foo:bar-all", "tested-versions": ["2.0", "2.1"], "metadata-version": "2.0" } ] diff --git a/common/jvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/index.json b/common/graalvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/index.json similarity index 72% rename from common/jvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/index.json rename to common/graalvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/index.json index b6e62fcce..f0b9f5906 100644 --- a/common/jvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/index.json +++ b/common/graalvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/index.json @@ -1,5 +1,5 @@ [ - { "module": "io.netty:netty-core", "directory": "io/netty/netty-core"}, + { "module": "io.netty:netty-core", "directory": "io.netty/netty-core"}, { "module": "org.jline:jline", "directory": "jline"}, { "module": "io.netty:netty-all", "requires": ["io.netty:netty-core", "org.jline:jline"] diff --git a/common/jvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/jline/placeholder.txt b/common/graalvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/io.netty/netty-core/placeholder.txt similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/jline/placeholder.txt rename to common/graalvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/io.netty/netty-core/placeholder.txt diff --git a/common/jvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/netty-core/placeholder.txt b/common/graalvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/jline/placeholder.txt similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/netty-core/placeholder.txt rename to common/graalvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/jline/placeholder.txt diff --git a/common/jvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/org/bar/placeholder.txt b/common/graalvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/org/bar/placeholder.txt similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/org/bar/placeholder.txt rename to common/graalvm-reachability-metadata/src/test/resources/json/modules/multi-dirs/org/bar/placeholder.txt diff --git a/common/jvm-reachability-metadata/src/test/resources/json/modules/single-dir/index.json b/common/graalvm-reachability-metadata/src/test/resources/json/modules/single-dir/index.json similarity index 70% rename from common/jvm-reachability-metadata/src/test/resources/json/modules/single-dir/index.json rename to common/graalvm-reachability-metadata/src/test/resources/json/modules/single-dir/index.json index 12872860b..674513410 100644 --- a/common/jvm-reachability-metadata/src/test/resources/json/modules/single-dir/index.json +++ b/common/graalvm-reachability-metadata/src/test/resources/json/modules/single-dir/index.json @@ -1,5 +1,5 @@ [ - { "module": "io.netty:netty-core", "directory": "io/netty/netty-core"}, + { "module": "io.netty:netty-core", "directory": "io.netty/netty-core"}, { "module": "org.jline:jline", "directory": "jline"}, { "module": "io.netty:netty-all", "requires": ["io.netty:netty-core"] diff --git a/common/jvm-reachability-metadata/src/test/resources/json/modules/single-dir/io/netty/netty-core/placeholder.txt b/common/graalvm-reachability-metadata/src/test/resources/json/modules/single-dir/io.netty/netty-core/placeholder.txt similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/json/modules/single-dir/io/netty/netty-core/placeholder.txt rename to common/graalvm-reachability-metadata/src/test/resources/json/modules/single-dir/io.netty/netty-core/placeholder.txt diff --git a/common/jvm-reachability-metadata/src/test/resources/json/modules/single-dir/jline/placeholder.txt b/common/graalvm-reachability-metadata/src/test/resources/json/modules/single-dir/jline/placeholder.txt similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/json/modules/single-dir/jline/placeholder.txt rename to common/graalvm-reachability-metadata/src/test/resources/json/modules/single-dir/jline/placeholder.txt diff --git a/common/jvm-reachability-metadata/src/test/resources/json/modules/single-dir/org/bar/placeholder.txt b/common/graalvm-reachability-metadata/src/test/resources/json/modules/single-dir/org/bar/placeholder.txt similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/json/modules/single-dir/org/bar/placeholder.txt rename to common/graalvm-reachability-metadata/src/test/resources/json/modules/single-dir/org/bar/placeholder.txt diff --git a/common/jvm-reachability-metadata/src/test/resources/repos/repo1/index.json b/common/graalvm-reachability-metadata/src/test/resources/repos/repo1/index.json similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/repos/repo1/index.json rename to common/graalvm-reachability-metadata/src/test/resources/repos/repo1/index.json diff --git a/common/jvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/1/reflect-config.json b/common/graalvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/1.0/reflect-config.json similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/1/reflect-config.json rename to common/graalvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/1.0/reflect-config.json diff --git a/common/jvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/2/reflect-config.json b/common/graalvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/1.1/reflect-config.json similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/2/reflect-config.json rename to common/graalvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/1.1/reflect-config.json diff --git a/common/jvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/index.json b/common/graalvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/index.json similarity index 74% rename from common/jvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/index.json rename to common/graalvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/index.json index cef1cc778..980fe87e7 100644 --- a/common/jvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/index.json +++ b/common/graalvm-reachability-metadata/src/test/resources/repos/repo1/org/foo/index.json @@ -4,14 +4,14 @@ "tested-versions": [ "1.0" ], - "metadata-version": "1" + "metadata-version": "1.0" }, { "module": "org:foo", "tested-versions": [ "1.1" ], - "metadata-version": "2", + "metadata-version": "1.1", "latest": true } ] diff --git a/common/jvm-reachability-metadata/src/test/resources/repos/repo2/index.json b/common/graalvm-reachability-metadata/src/test/resources/repos/repo2/index.json similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/repos/repo2/index.json rename to common/graalvm-reachability-metadata/src/test/resources/repos/repo2/index.json diff --git a/common/jvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/1/reflect-config.json b/common/graalvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/1.0/reflect-config.json similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/1/reflect-config.json rename to common/graalvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/1.0/reflect-config.json diff --git a/common/jvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/2/reflect-config.json b/common/graalvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/1.1/reflect-config.json similarity index 100% rename from common/jvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/2/reflect-config.json rename to common/graalvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/1.1/reflect-config.json diff --git a/common/jvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/index.json b/common/graalvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/index.json similarity index 78% rename from common/jvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/index.json rename to common/graalvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/index.json index 82b6277d0..b2d751163 100644 --- a/common/jvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/index.json +++ b/common/graalvm-reachability-metadata/src/test/resources/repos/repo2/org/foo/index.json @@ -1,5 +1,5 @@ [ - { "module": "org:foo", "tested-versions": ["1.0"], "metadata-version": "1" }, - { "module": "org:foo", "tested-versions": ["1.1"], "metadata-version": "2" }, - { "module": "org:bar", "tested-versions": ["2.1"], "metadata-version": "2" } + { "module": "org:foo", "tested-versions": ["1.0"], "metadata-version": "1.0" }, + { "module": "org:foo", "tested-versions": ["1.1"], "metadata-version": "1.1" }, + { "module": "org:bar", "tested-versions": ["2.1"], "metadata-version": "1.1" } ] diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java index 4e8c9dd21..25762dbc9 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java @@ -79,7 +79,8 @@ public void onLoad(NativeImageConfiguration config) { "org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor", "org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor", "org.junit.jupiter.engine.execution.ConditionEvaluator", - "org.junit.jupiter.engine.execution.ExecutableInvoker" + "org.junit.jupiter.engine.execution.ExecutableInvoker", + "org.junit.jupiter.params.provider.EnumSource$Mode", }; for (String className : buildTimeInitializedClasses) { config.initializeAtBuildTime(className); diff --git a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/util/AnnotationUtils.java b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/util/AnnotationUtils.java index a882afd8f..a04962e62 100644 --- a/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/util/AnnotationUtils.java +++ b/common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/util/AnnotationUtils.java @@ -42,7 +42,6 @@ package org.graalvm.junit.platform.config.util; import org.graalvm.junit.platform.config.core.NativeImageConfiguration; -import org.graalvm.util.GuardedAnnotationAccess; import org.junit.platform.commons.support.AnnotationSupport; import java.lang.annotation.Annotation; @@ -96,7 +95,7 @@ private static void forEachMethod(Class clazz, Consumer consumer) { } private static List getAnnotations(AnnotatedElement element, Class annotation) { - if (GuardedAnnotationAccess.getAnnotation(annotation, Repeatable.class) != null) { + if (annotation.getAnnotation(Repeatable.class) != null) { return AnnotationSupport.findRepeatableAnnotations(element, annotation); } else { Optional optionalAnnotation = AnnotationSupport.findAnnotation(element, annotation); diff --git a/common/utils/src/main/java/org/graalvm/buildtools/utils/FileUtils.java b/common/utils/src/main/java/org/graalvm/buildtools/utils/FileUtils.java index cd731213a..5c8438ecd 100644 --- a/common/utils/src/main/java/org/graalvm/buildtools/utils/FileUtils.java +++ b/common/utils/src/main/java/org/graalvm/buildtools/utils/FileUtils.java @@ -42,11 +42,16 @@ package org.graalvm.buildtools.utils; import java.io.IOException; +import java.math.BigInteger; import java.net.HttpURLConnection; +import java.net.URI; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.Optional; import java.util.function.Consumer; import java.util.zip.ZipEntry; @@ -140,4 +145,19 @@ private static Optional sanitizePath(ZipEntry entry, Path destination) { return Optional.empty(); } } + + public static String hashFor(URI uri) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-1"); + byte[] messageDigest = md.digest(md.digest(uri.toString().getBytes(StandardCharsets.UTF_8))); + BigInteger no = new BigInteger(1, messageDigest); + StringBuilder digest = new StringBuilder(no.toString(16)); + while (digest.length() < 32) { + digest.insert(0, "0"); + } + return digest.toString(); + } catch (NoSuchAlgorithmException e) { + throw new UnsupportedOperationException(e); + } + } } diff --git a/common/utils/src/main/java/org/graalvm/buildtools/utils/SharedConstants.java b/common/utils/src/main/java/org/graalvm/buildtools/utils/SharedConstants.java index 11f3d1e48..6498e8d60 100644 --- a/common/utils/src/main/java/org/graalvm/buildtools/utils/SharedConstants.java +++ b/common/utils/src/main/java/org/graalvm/buildtools/utils/SharedConstants.java @@ -75,5 +75,6 @@ public interface SharedConstants { String AGENT_SESSION_SUBDIR = "session-{pid}-{datetime}"; String AGENT_OUTPUT_DIRECTORY_MARKER = "{output_dir}"; String AGENT_OUTPUT_DIRECTORY_OPTION = "config-output-dir="; - String METADATA_REPO_URL_TEMPLATE = "https://github.com/graalvm/graalvm-reachability-metadata/releases/download/%1$s/graalvm-reachability-metadata-%1$s.zip"; + String METADATA_REPO_URL_TEMPLATE = "https://github.com/oracle/graalvm-reachability-metadata/releases/download/%1$s/graalvm-reachability-metadata-%1$s.zip"; + String METADATA_REPO_DEFAULT_VERSION = "0.1.0"; } diff --git a/common/utils/src/test/java/org/graalvm/buildtools/utils/FileUtilsTest.java b/common/utils/src/test/java/org/graalvm/buildtools/utils/FileUtilsTest.java index 661a4777b..0af07030f 100644 --- a/common/utils/src/test/java/org/graalvm/buildtools/utils/FileUtilsTest.java +++ b/common/utils/src/test/java/org/graalvm/buildtools/utils/FileUtilsTest.java @@ -1,3 +1,43 @@ +/* + * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package org.graalvm.buildtools.utils; import org.junit.jupiter.api.DisplayName; @@ -17,7 +57,9 @@ import java.util.Optional; import java.util.stream.Stream; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; class FileUtilsTest { @@ -90,15 +132,17 @@ void testExtract(@TempDir Path tempDir) throws IOException { assertEquals("[]", String.join("\n", Files.readAllLines(tempDir.resolve("index.json")))); assertTrue(Files.isDirectory(tempDir.resolve("org"))); - assertTrue(Files.isDirectory(tempDir.resolve("org/graalvm"))); - assertTrue(Files.isDirectory(tempDir.resolve("org/graalvm/internal"))); - assertTrue(Files.isDirectory(tempDir.resolve("org/graalvm/internal/library-with-reflection"))); - assertTrue(Files.exists(tempDir.resolve("org/graalvm/internal/library-with-reflection/index.json"))); - assertTrue(Files.isDirectory(tempDir.resolve("org/graalvm/internal/library-with-reflection/1"))); - - assertTrue(Files.exists(tempDir.resolve("org/graalvm/internal/library-with-reflection/1/reflect-config.json"))); - assertEquals("[ { \"name\": \"org.graalvm.internal.reflect.Message\", \"allDeclaredFields\": true, \"allDeclaredMethods\": true }]", String.join("", Files.readAllLines(tempDir.resolve("org/graalvm/internal/library-with-reflection/1/reflect-config.json")))); + assertTrue(Files.isDirectory(tempDir.resolve("org.graalvm"))); + assertTrue(Files.isDirectory(tempDir.resolve("org.graalvm.internal"))); + assertTrue(Files.isDirectory(tempDir.resolve("org.graalvm.internal/library-with-reflection"))); + assertTrue(Files.exists(tempDir.resolve("org.graalvm.internal/library-with-reflection/index.json"))); + assertTrue(Files.isDirectory(tempDir.resolve("org.graalvm.internal/library-with-reflection/1"))); + + assertTrue(Files.exists(tempDir.resolve("org.graalvm.internal/library-with-reflection/1/reflect-config.json"))); + assertEquals("[ { \"name\": \"org.graalvm.internal.reflect.Message\", \"allDeclaredFields\": true, \"allDeclaredMethods\": true }]", + String.join("", Files.readAllLines(tempDir.resolve("org.graalvm.internal/library-with-reflection/1/reflect-config.json")))); } + @Test @DisplayName("It is protected against ZIP slip attacks") void testZipSlip(@TempDir Path tempDir) throws IOException { diff --git a/config/checkstyle.xml b/config/checkstyle.xml index 69feab659..0aea45ea4 100644 --- a/config/checkstyle.xml +++ b/config/checkstyle.xml @@ -18,20 +18,6 @@ - - - - - - - - - diff --git a/docs/src/docs/asciidoc/gradle-plugin.adoc b/docs/src/docs/asciidoc/gradle-plugin.adoc index 3b82f7f6c..418393a93 100644 --- a/docs/src/docs/asciidoc/gradle-plugin.adoc +++ b/docs/src/docs/asciidoc/gradle-plugin.adoc @@ -156,6 +156,7 @@ If you do this, the plugin will search for 2 environment variables: `GRAALVM_HOM If one of them is set, it will assume that it points to a valid GraalVM installation and completely bypass toolchain selection. Therefore, it becomes your responsibility to make sure that the environment variable points to a JDK that is compatible with your build script requirements (in particular, the language version). +[[configuration-options]] ==== Configuration options The following configuration options are available for building images: @@ -227,37 +228,6 @@ Currently, this feature requires the execution of the tests in the classic "JVM" NOTE: This plugin requires JUnit Platform 1.8 or higher. -[[mockito-bytebuddy-support]] -=== Mockito / Byte Buddy support - -Mockito is supported starting from version 4.5.0 (ByteBuddy >= 1.12.9) with GraalVM >= 22.1. -However, you need to add the following configuration to make it work with GraalVM 22.1: - -.Enabling Mockito / Byte Buddy support on GraalVM 22.1 -[source,groovy,role="multi-language-sample"] ----- -graalvmNative { - binaries { - test { - buildArgs.add("--rerun-class-initialization-at-runtime=net.bytebuddy.ClassFileVersion,net.bytebuddy.utility.dispatcher.JavaDispatcher,net.bytebuddy.utility.Invoker$Dispatcher") - buildArgs.add("--initialize-at-build-time=net.bytebuddy.description.method.MethodDescription$InDefinedShape$AbstractBase$ForLoadedExecutable,net.bytebuddy.description.type.TypeDescription$AbstractBase,net.bytebuddy.description.type.TypeDescription$ForLoadedType,net.bytebuddy.description.method.MethodDescription$ForLoadedMethod,net.bytebuddy.implementation.bind.annotation.Argument$BindingMechanic,net.bytebuddy.implementation.bind.annotation.Argument$BindingMechanic$1,net.bytebuddy.implementation.bind.annotation.Argument$BindingMechanic$2,net.bytebuddy.implementation.bind.annotation.Super$Instantiation$2") - } - } -} ----- - -[source,kotlin,role="multi-language-sample"] ----- -graalvmNative { - binaries { - named("test") { - buildArgs.add("--rerun-class-initialization-at-runtime=net.bytebuddy.ClassFileVersion,net.bytebuddy.utility.dispatcher.JavaDispatcher,net.bytebuddy.utility.Invoker$Dispatcher") - buildArgs.add("--initialize-at-build-time=net.bytebuddy.description.method.MethodDescription$InDefinedShape$AbstractBase$ForLoadedExecutable,net.bytebuddy.description.type.TypeDescription$AbstractBase,net.bytebuddy.description.type.TypeDescription$ForLoadedType,net.bytebuddy.description.method.MethodDescription$ForLoadedMethod,net.bytebuddy.implementation.bind.annotation.Argument$BindingMechanic,net.bytebuddy.implementation.bind.annotation.Argument$BindingMechanic$1,net.bytebuddy.implementation.bind.annotation.Argument$BindingMechanic$2,net.bytebuddy.implementation.bind.annotation.Super$Instantiation$2") - } - } -} ----- - [[testing-support-disabling]] === Disabling testing support @@ -349,24 +319,16 @@ The plugin will also substitute `{output_dir}` in the agent options to point to === Configuring agent options The native agent can be configured https://www.graalvm.org/reference-manual/native-image/Agent/[with additional options]. -This can be done using the `agent` configuration block: +This can be done using the `agent` configuration block. +Each agent option has a corresponding field in the DSL. +See <> for the full list of available options. -.Configuring agent options -[source, groovy, role="multi-language-sample"] ----- -include::../snippets/gradle/groovy/build.gradle[tags=add-agent-options] ----- - -[source, kotlin, role="multi-language-sample"] ----- -include::../snippets/gradle/kotlin/build.gradle.kts[tags=add-agent-options] ----- [[metadata-support]] == GraalVM Reachability Metadata Support -Since release 0.9.11, the plugin adds experimental support for the https://github.com/graalvm/graalvm-reachability-metadata/[GraalVM reachability metadata repository]. -This repository provides GraalVM configuration for libraries which do not officially support GraalVM native. +Since release 0.9.11, the plugin adds experimental support for the https://github.com/oracle/graalvm-reachability-metadata/[GraalVM reachability metadata repository]. +This repository provides https://www.graalvm.org/22.2/reference-manual/native-image/ReachabilityMetadata/[reachability metadata] for libraries that do not support GraalVM Native Image. === Enabling the metadata repository diff --git a/docs/src/docs/asciidoc/index.adoc b/docs/src/docs/asciidoc/index.adoc index 608813e3c..ef5a02ff3 100644 --- a/docs/src/docs/asciidoc/index.adoc +++ b/docs/src/docs/asciidoc/index.adoc @@ -16,6 +16,14 @@ If you are using alternative build systems, see <= 1.12.9) with GraalVM >= 22.1. -However, you need to add the following configuration to make it work with GraalVM 22.1: - -.Enabling Mockito / Byte Buddy support on GraalVM 22.1 -[source,xml] ----- - - - --rerun-class-initialization-at-runtime=net.bytebuddy.ClassFileVersion,net.bytebuddy.utility.dispatcher.JavaDispatcher,net.bytebuddy.utility.Invoker$Dispatcher - --initialize-at-build-time=net.bytebuddy.description.method.MethodDescription$InDefinedShape$AbstractBase$ForLoadedExecutable,net.bytebuddy.description.type.TypeDescription$AbstractBase,net.bytebuddy.description.type.TypeDescription$ForLoadedType,net.bytebuddy.description.method.MethodDescription$ForLoadedMethod,net.bytebuddy.implementation.bind.annotation.Argument$BindingMechanic,net.bytebuddy.implementation.bind.annotation.Argument$BindingMechanic$1,net.bytebuddy.implementation.bind.annotation.Argument$BindingMechanic$2,net.bytebuddy.implementation.bind.annotation.Super$Instantiation$2 - - ----- - [[testing-support-disabling]] === Disabling testing support @@ -573,9 +556,6 @@ command-line argument to Maven as follows. See the documentation for mvn -Pnative -Dagent=true -DagentOptions=periodic-config test ``` -WARNING: If the agent is enabled, the `--allow-incomplete-classpath` option is -automatically added to your native build options. - [[agent-support-running-application]] === Running your application with the agent @@ -609,27 +589,21 @@ with those configuration files, you then need to execute the following command: mvn -Pnative -Dagent=true -DskipTests package exec:exec@native ``` -WARNING: If the agent is enabled, the `--allow-incomplete-classpath` option is -automatically added to your native build options. - [[metadata-support]] == GraalVM Reachability Metadata Support -Since release 0.9.12, the plugin adds experimental support for the https://github.com/graalvm/graalvm-reachability-metadata/[GraalVM reachability metadata repository]. -This repository provides GraalVM metadata for libraries which do not officially support GraalVM native. - -A metadata repository consists of configuration files for GraalVM. +Since release 0.9.12, the plugin adds support for the https://github.com/oracle/graalvm-reachability-metadata/[GraalVM reachability metadata repository]. +This repository provides https://www.graalvm.org/22.2/reference-manual/native-image/ReachabilityMetadata/[reachability metadata] for libraries that do not support GraalVM Native Image. === Enabling the metadata repository -Support needs to be enabled explicitly:. It is possible to use a _local repository_, in which case you can specify the path to the repository: +Support needs to be enabled explicitly by including the following into the `` element: .Enabling the metadata repository [source,xml,indent=0] ---- -include::../../../../samples/native-config-integration/pom.xml[tag=metadata-local] +include::../../../../samples/metadata-repo-integration/pom.xml[tag=metadata-default] ---- -<1> The local path can point to an _exploded_ directory, or to a compressed ZIP file. Alternatively, you can use a _remote repository_, in which case you can specify the URL of the ZIP file: @@ -639,9 +613,27 @@ Alternatively, you can use a _remote repository_, in which case you can specify include::../../../../samples/native-config-integration/pom.xml[tag=metadata-url] ---- +For debugging purposes you can use a local repository: + +.Enabling a local repository +[source,xml,indent=0] +---- +include::../../../../samples/native-config-integration/pom.xml[tag=metadata-local] +---- +<1> The local path can point to an _exploded_ directory, or to a compressed ZIP file. + === Configuring the metadata repository -Once activated, for each library included in the native image, the plugin will automatically search for GraalVM reachability metadata in the repository. +Once activated, for each library included in the native image, the plugin will automatically search for GraalVM reachability metadata in the repository that was released together with the plugin. +In case you want to use another verion of the metadata use: + +.Choosing a version for the metadata repository +[source,xml,indent=0] +---- +include::../../../../samples/metadata-repo-integration/pom.xml[tag=metadata-versioned] +---- + + In some cases, you may need to exclude a particular module from the search. This can be done by configuring that particular dependency: diff --git a/docs/src/docs/snippets/gradle/groovy/build.gradle b/docs/src/docs/snippets/gradle/groovy/build.gradle index fd385b6c9..ff96c78c3 100644 --- a/docs/src/docs/snippets/gradle/groovy/build.gradle +++ b/docs/src/docs/snippets/gradle/groovy/build.gradle @@ -67,9 +67,9 @@ if (providers.environmentVariable("DISABLE_TOOLCHAIN").isPresent()) { // tag::all-config-options[] graalvmNative { - // Injects the native-image-agent into supported tasks if `-Pagent` is specified agent { defaultMode = "standard" // Default agent mode if one isn't specified using `-Pagent=mode_name` + enabled = true // Enables the agent modes { // The standard agent mode generates metadata without conditions. @@ -78,7 +78,7 @@ graalvmNative { // The conditional agent mode generates metadata with conditions. conditional { userCodeFilterPath = "path-to-filter.json" // Path to a filter file that determines classes which will be used in the metadata conditions. - extrFilterPath = "path-to-another-filter.json" // Optional, extra filter used to further filter the collected metadata. + extraFilterPath = "path-to-another-filter.json" // Optional, extra filter used to further filter the collected metadata. } // The direct agent mode allows users to directly pass options to the agent. direct { @@ -165,33 +165,6 @@ graalvmNative { } // end::disable-test-support[] -// tag::add-agent-options[] -graalvmNative { - binaries.configureEach { - agent { - options.add("experimental-class-loader-support") - } - } -} -// end::add-agent-options[] - -// tag::add-agent-options-individual[] -graalvmNative { - binaries { - main { - agent { - options.add("experimental-class-loader-support") - } - } - test { - agent { - options.add("access-filter-file=${projectDir}/src/test/resources/access-filter.json") - } - } - } -} -// end::add-agent-options-individual[] - // tag::enable-metadata-repository[] graalvmNative { metadataRepository { @@ -203,7 +176,7 @@ graalvmNative { // tag::specify-metadata-repository-version[] graalvmNative { metadataRepository { - version = "1.0.0" + version = "0.1.0" } } // end::specify-metadata-repository-version[] diff --git a/docs/src/docs/snippets/gradle/kotlin/build.gradle.kts b/docs/src/docs/snippets/gradle/kotlin/build.gradle.kts index b0ff46706..e30f416a1 100644 --- a/docs/src/docs/snippets/gradle/kotlin/build.gradle.kts +++ b/docs/src/docs/snippets/gradle/kotlin/build.gradle.kts @@ -68,6 +68,49 @@ if (providers.environmentVariable("DISABLE_TOOLCHAIN").isPresent()) { // tag::all-config-options[] graalvmNative { + agent { + defaultMode.set("standard") // Default agent mode if one isn't specified using `-Pagent=mode_name` + enabled.set(true) // Enables the agent + + modes { + // The standard agent mode generates metadata without conditions. + standard { + } + // The conditional agent mode generates metadata with conditions. + conditional { + userCodeFilterPath.set("path-to-filter.json") // Path to a filter file that determines classes which will be used in the metadata conditions. + extraFilterPath.set("path-to-another-filter.json") // Optional, extra filter used to further filter the collected metadata. + } + // The direct agent mode allows users to directly pass options to the agent. + direct { + // {output_dir} is a special string expanded by the plugin to where the agent files would usually be output. + options.add("config-output-dir={output_dir}") + options.add("experimental-configuration-with-origins") + } + } + + callerFilterFiles.from("filter.json") + accessFilterFiles.from("filter.json") + builtinCallerFilter.set(true) + builtinHeuristicFilter.set(true) + enableExperimentalPredefinedClasses.set(false) + enableExperimentalUnsafeAllocationTracing.set(false) + trackReflectionMetadata.set(true) + + // Copies metadata collected from tasks into the specified directories. + metadataCopy { + inputTaskNames.add("test") // Tasks previously executed with the agent attached. + outputDirectories.add("src/main/resources/META-INF/native-image") + mergeWithExisting.set(true) // Instead of copying, merge with existing metadata in the output directories. + } + + /* + By default, if `-Pagent` is specified, all tasks that extend JavaForkOptions are instrumented. + This can be limited to only specific tasks that match this predicate. + */ + tasksToInstrumentPredicate.set(t -> true) + } + binaries { named("main") { // Main options @@ -135,14 +178,6 @@ graalvmNative { } // end::custom-binary[] -// tag::add-agent-options[] -graalvmNative { - agent { - enableExperimentalPredefinedClasses = true - } -} -// end::add-agent-options[] - // tag::enable-metadata-repository[] graalvmNative { metadataRepository { @@ -154,7 +189,7 @@ graalvmNative { // tag::specify-metadata-repository-version[] graalvmNative { metadataRepository { - version.set("1.0.0") + version.set("0.1.0") } } // end::specify-metadata-repository-version[] diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c94314b55..ed2f7379b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,22 +1,22 @@ [versions] # Project versions -nativeBuildTools = "0.9.12" +nativeBuildTools = "0.9.13" # External dependencies -spock = "2.0-groovy-3.0" -maven = "3.3.9" -mavenAnnotations = "3.5.1" -mavenEmbedder = "3.8.1" +spock = "2.1-groovy-3.0" +maven = "3.8.5" +mavenAnnotations = "3.6.4" +mavenEmbedder = "3.8.3" mavenWagon = "3.4.3" -graalvm = "21.1.0" -jackson = "2.12.4" +graalvm = "22.0.0" +jackson = "2.13.3" junitPlatform = "1.8.1" junitJupiter = "5.8.1" aether = "1.1.0" slf4j = "1.7.9" -groovy = "3.0.8" +groovy = "3.0.11" jgit = "5.12.0.202106070339-r" -jetty = "11.0.9" +jetty = "11.0.11" [libraries] # Local projects @@ -24,7 +24,7 @@ nativeGradlePlugin = { module = "org.graalvm.buildtools:native-gradle-plugin", v nativeMavenPlugin = { module = "org.graalvm.buildtools:native-maven-plugin", version.ref = "nativeBuildTools" } junitPlatformNative = { module = "org.graalvm.buildtools:junit-platform-native", version.ref = "nativeBuildTools" } utils = { module = "org.graalvm.buildtools:utils", version.ref = "nativeBuildTools" } -jvmReachabilityMetadata = { module = "org.graalvm.buildtools:jvm-reachability-metadata", version.ref = "nativeBuildTools" } +jvmReachabilityMetadata = { module = "org.graalvm.buildtools:graalvm-reachability-metadata", version.ref = "nativeBuildTools" } # External dependencies test-junit-platform-console = { module = "org.junit.platform:junit-platform-console", version.ref = "junitPlatform" } diff --git a/native-gradle-plugin/README.md b/native-gradle-plugin/README.md index 2bb353f1a..a98aae8f5 100644 --- a/native-gradle-plugin/README.md +++ b/native-gradle-plugin/README.md @@ -7,7 +7,7 @@ End-user documentation about the plugins can be found [here](https://graalvm.git ## Building Building of plugin itself should be as simple as: ```bash -./gradlew publishToMavenLocal +./gradlew publishToMavenLocal --no-parallel ``` In order to run testing part of this plugin you need to get (or build) corresponding `junit-platform-native` artifact. diff --git a/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/NativeConfigRepoFunctionalTest.groovy b/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/NativeConfigRepoFunctionalTest.groovy index 043e5ad37..30d067106 100644 --- a/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/NativeConfigRepoFunctionalTest.groovy +++ b/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/NativeConfigRepoFunctionalTest.groovy @@ -78,7 +78,7 @@ class NativeConfigRepoFunctionalTest extends AbstractFunctionalTest { outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory not found. Trying latest version." and: "but finds one thanks to the latest configuration field" - outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org/graalvm/internal/library-with-reflection/1" + outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org.graalvm.internal/library-with-reflection/1" where: format | label diff --git a/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/OfficialMetadataRepoFunctionalTest.groovy b/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/OfficialMetadataRepoFunctionalTest.groovy new file mode 100644 index 000000000..2d4c3ae2a --- /dev/null +++ b/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/OfficialMetadataRepoFunctionalTest.groovy @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.graalvm.buildtools.gradle + +import org.graalvm.buildtools.gradle.fixtures.AbstractFunctionalTest +import org.gradle.api.logging.LogLevel +import spock.lang.Unroll + +class OfficialMetadataRepoFunctionalTest extends AbstractFunctionalTest { + + def "the application runs when using the official metadata repository"() { + given: + withSample("metadata-repo-integration") + + when: + run 'nativeRun', "-D${NativeImagePlugin.CONFIG_REPO_LOGLEVEL}=${LogLevel.LIFECYCLE}" + + then: + tasks { + succeeded ':jar', ':nativeCompile', ':nativeRun' + } + + and: "finds metadata in the remote repository" + outputContains "[graalvm reachability metadata repository for com.h2database:h2:2.1.210]: Configuration directory is com.h2database/h2/2.1.210" + } + +} diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java index f7dc15a66..70b887e25 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java @@ -139,6 +139,7 @@ public class NativeImagePlugin implements Plugin { public static final String NATIVE_TEST_COMPILE_TASK_NAME = "nativeTestCompile"; public static final String NATIVE_TEST_TASK_NAME = "nativeTest"; public static final String NATIVE_MAIN_EXTENSION = "main"; + public static final String NATIVE_TEST_EXTENSION = "test"; public static final String DEPRECATED_NATIVE_BUILD_EXTENSION = "nativeBuild"; public static final String DEPRECATED_NATIVE_TEST_EXTENSION = "nativeTest"; @@ -248,7 +249,7 @@ private void configureJavaProject(Project project, Provider t.doFirst("Warn about deprecation", task -> task.getLogger().warn("Task " + DEPRECATED_NATIVE_BUILD_TASK + " is deprecated. Use " + NATIVE_COMPILE_TASK_NAME + " instead.")); }); - graalExtension.registerTestBinary("test", config -> { + graalExtension.registerTestBinary(NATIVE_TEST_EXTENSION, config -> { config.forTestTask(tasks.named("test", Test.class)); config.usingSourceSet(GradleUtils.findSourceSet(project, SourceSet.TEST_SOURCE_SET_NAME)); }); @@ -422,6 +423,7 @@ private GraalVMExtension registerGraalVMExtension(Project project) { private void configureNativeConfigurationRepo(ExtensionAware graalvmNative) { GraalVMReachabilityMetadataRepositoryExtension configurationRepository = graalvmNative.getExtensions().create("metadataRepository", GraalVMReachabilityMetadataRepositoryExtension.class); configurationRepository.getEnabled().convention(false); + configurationRepository.getVersion().convention(SharedConstants.METADATA_REPO_DEFAULT_VERSION); configurationRepository.getUri().convention(configurationRepository.getVersion().map(v -> { try { return new URI(String.format(METADATA_REPO_URL_TEMPLATE, v)); @@ -522,7 +524,7 @@ private static Provider agentProperty(Project project, AgentOptions opti } return options.getDefaultMode().get(); }) - .orElse(project.provider(() -> "disabled")); + .orElse(options.getEnabled().map(enabled -> enabled ? options.getDefaultMode().get() : "disabled")); } private static void registerServiceProvider(Project project, Provider nativeImageServiceProvider) { diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/agent/AgentOptions.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/agent/AgentOptions.java index 590e5e274..4726f1d72 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/agent/AgentOptions.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/agent/AgentOptions.java @@ -72,6 +72,13 @@ default void modes(Action spec) { @Optional Property getDefaultMode(); + /** + * Enables the agent. + */ + @Input + @Optional + Property getEnabled(); + /** * Caller-filter files that will be passed to the agent. */ diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/DefaultGraalVmExtension.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/DefaultGraalVmExtension.java index 96e377b37..f61a785f8 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/DefaultGraalVmExtension.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/DefaultGraalVmExtension.java @@ -78,6 +78,7 @@ public DefaultGraalVmExtension(NamedDomainObjectContainer na AgentOptions agentOpts = getAgent(); agentOpts.getTasksToInstrumentPredicate().convention(t -> true); agentOpts.getDefaultMode().convention("standard"); + agentOpts.getEnabled().convention(false); agentOpts.getModes().getConditional().getParallel().convention(true); agentOpts.getMetadataCopy().getMergeWithExisting().convention(false); agentOpts.getFilterableEntries().convention(Arrays.asList("org.gradle.", "java.", "org.junit.")); diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/GraalVMReachabilityMetadataService.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/GraalVMReachabilityMetadataService.java index f2335e2d4..d348f0b31 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/GraalVMReachabilityMetadataService.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/GraalVMReachabilityMetadataService.java @@ -40,6 +40,7 @@ */ package org.graalvm.buildtools.gradle.internal; +import org.graalvm.buildtools.utils.FileUtils; import org.graalvm.reachability.GraalVMReachabilityMetadataRepository; import org.graalvm.reachability.Query; import org.graalvm.reachability.internal.FileSystemRepository; @@ -57,16 +58,12 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.math.BigInteger; import java.net.URI; import java.net.URISyntaxException; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.Collection; import java.util.Set; import java.util.function.Consumer; @@ -96,23 +93,8 @@ public GraalVMReachabilityMetadataService() throws URISyntaxException { this.repository = newRepository(uri); } - private static String hashFor(URI uri) { - try { - MessageDigest md = MessageDigest.getInstance("SHA-1"); - byte[] messageDigest = md.digest(md.digest(uri.toString().getBytes(StandardCharsets.UTF_8))); - BigInteger no = new BigInteger(1, messageDigest); - StringBuilder digest = new StringBuilder(no.toString(16)); - while (digest.length() < 32) { - digest.insert(0, "0"); - } - return digest.toString(); - } catch (NoSuchAlgorithmException e) { - throw new UnsupportedOperationException(e); - } - } - private GraalVMReachabilityMetadataRepository newRepository(URI uri) throws URISyntaxException { - String cacheKey = hashFor(uri); + String cacheKey = FileUtils.hashFor(uri); String path = uri.getPath(); LogLevel logLevel = getParameters().getLogLevel().get(); if (uri.getScheme().equals("file")) { @@ -122,9 +104,23 @@ private GraalVMReachabilityMetadataRepository newRepository(URI uri) throws URIS } return newRepositoryFromDirectory(localFile.toPath(), logLevel); } - if (FileSystemRepository.isSupportedArchiveFormat(path)) { - File zipped = getParameters().getCacheDir().file(cacheKey + "/archive").get().getAsFile(); + String format = FileSystemRepository.getArchiveFormat(path); + if (format != null) { + File zipped = getParameters().getCacheDir().file(cacheKey + "/archive" + format).get().getAsFile(); if (!zipped.exists()) { + File cacheDirParent = zipped.getParentFile(); + if (cacheDirParent.exists()) { + if (!cacheDirParent.isDirectory()) { + throw new RuntimeException("Cache directory path must not exist or must be a directory: " + cacheDirParent.getAbsolutePath()); + } + } else { + try { + Files.createDirectories(cacheDirParent.toPath()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + try (ReadableByteChannel readableByteChannel = Channels.newChannel(uri.toURL().openStream())) { try (FileOutputStream fileOutputStream = new FileOutputStream(zipped)) { fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE); diff --git a/native-maven-plugin/reproducers/issue-144/pom.xml b/native-maven-plugin/reproducers/issue-144/pom.xml index 085fd199b..004761d01 100644 --- a/native-maven-plugin/reproducers/issue-144/pom.xml +++ b/native-maven-plugin/reproducers/issue-144/pom.xml @@ -56,8 +56,8 @@ 1.8 UTF-8 - 0.9.12 - 0.9.12 + 0.9.13 + 0.9.13 example-app org.graalvm.demo.Application diff --git a/native-maven-plugin/settings.gradle.kts b/native-maven-plugin/settings.gradle.kts index ca0381d31..3bf86a868 100644 --- a/native-maven-plugin/settings.gradle.kts +++ b/native-maven-plugin/settings.gradle.kts @@ -53,4 +53,4 @@ rootProject.name = "native-maven-plugin" includeBuild("../common/junit-platform-native") includeBuild("../common/utils") -includeBuild("../common/jvm-reachability-metadata") +includeBuild("../common/graalvm-reachability-metadata") diff --git a/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/MetadataRepositoryFunctionalTest.groovy b/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/MetadataRepositoryFunctionalTest.groovy index 0f72f9c0f..6d387b4b4 100644 --- a/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/MetadataRepositoryFunctionalTest.groovy +++ b/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/MetadataRepositoryFunctionalTest.groovy @@ -55,19 +55,6 @@ class MetadataRepositoryFunctionalTest extends AbstractGraalVMMavenFunctionalTes outputContains "Reflection failed" } - void "it produces a warning if enabled but no repository is configured"() { - given: - withSample("native-config-integration") - - when: - mvn '-Pnative,metadataEnabled', '-DskipTests', 'package', 'exec:exec@native' - - then: - buildSucceeded - outputContains "GraalVM reachability metadata repository is enabled, but no repository has been configured" - outputContains "Reflection failed" - } - void "it can use a metadata repository"() { given: withSample("native-config-integration") @@ -83,7 +70,7 @@ class MetadataRepositoryFunctionalTest extends AbstractGraalVMMavenFunctionalTes outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory not found. Trying latest version." and: "but it finds one thanks to the latest configuration field" - outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org/graalvm/internal/library-with-reflection/1" + outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org.graalvm.internal/library-with-reflection/1" } void "if excludeConfig is set it is added to the command line invocation"() { @@ -91,7 +78,7 @@ class MetadataRepositoryFunctionalTest extends AbstractGraalVMMavenFunctionalTes withSample("native-config-integration") when: - mvn '-Pnative,metadataLocal,excludeConfigTest', '-DnativeDryRun', 'package' + mvn '-Pnative,metadataDefault,excludeConfigTest', '-DnativeDryRun', 'package' then: buildSucceeded @@ -151,7 +138,7 @@ class MetadataRepositoryFunctionalTest extends AbstractGraalVMMavenFunctionalTes outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory not found. Trying latest version." and: "but it finds one thanks to the latest configuration field" - outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org/graalvm/internal/library-with-reflection/1" + outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org.graalvm.internal/library-with-reflection/1" } void "it can download a remote repository"() { @@ -171,7 +158,7 @@ class MetadataRepositoryFunctionalTest extends AbstractGraalVMMavenFunctionalTes outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory not found. Trying latest version." and: "but it finds one thanks to the latest configuration field" - outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org/graalvm/internal/library-with-reflection/1" + outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org.graalvm.internal/library-with-reflection/1" } void "when pointing to a missing URL, reflection fails"() { diff --git a/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/OfficialMetadataRepositoryFunctionalTest.groovy b/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/OfficialMetadataRepositoryFunctionalTest.groovy new file mode 100644 index 000000000..5beb4a0c9 --- /dev/null +++ b/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/OfficialMetadataRepositoryFunctionalTest.groovy @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.graalvm.buildtools.maven + +class OfficialMetadataRepositoryFunctionalTest extends AbstractGraalVMMavenFunctionalTest { + void "the application runs when using the official metadata repository"() { + given: + withSample("metadata-repo-integration") + + when: + mvn '-Pnative', '-DskipTests', 'package', 'exec:exec@native' + + then: + buildSucceeded + + and: "the run succeeded and retrieved data from the database" + outputContains "Customers in the database" + + and: "finds metadata in the remote repository" + outputContains "[graalvm reachability metadata repository for com.h2database:h2:2.1.210]: Configuration directory is com.h2database/h2/2.1.210" + } + + void "the application runs when using the versioned official metadata repository"() { + given: + withSample("metadata-repo-integration") + + when: + mvn '-PnativeVersioned', '-DskipTests', 'package', 'exec:exec@native' + + then: + buildSucceeded + + and: "the run succeeded and retrieved data from the database" + outputContains "Customers in the database" + + and: "finds metadata in the remote repository" + outputContains "[graalvm reachability metadata repository for com.h2database:h2:2.1.210]: Configuration directory is com.h2database/h2/2.1.210" + } +} diff --git a/native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/AbstractNativeMojo.java b/native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/AbstractNativeMojo.java index 1d35589a5..b8cc93b9b 100644 --- a/native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/AbstractNativeMojo.java +++ b/native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/AbstractNativeMojo.java @@ -446,22 +446,49 @@ protected boolean isMetadataRepositoryEnabled() { protected void configureMetadataRepository() { if (isMetadataRepositoryEnabled()) { Path repoPath = null; - if (metadataRepositoryConfiguration.getVersion() != null && metadataRepositoryConfiguration.getUrl() == null) { - String metadataUrl = String.format(METADATA_REPO_URL_TEMPLATE, metadataRepositoryConfiguration.getVersion()); - try { - metadataRepositoryConfiguration.setUrl(new URI(metadataUrl).toURL()); - } catch (URISyntaxException | MalformedURLException e) { - throw new RuntimeException(e); - } + Path destinationRoot = outputDirectory.toPath().resolve("graalvm-reachability-metadata"); + if (Files.exists(destinationRoot) && !Files.isDirectory(destinationRoot)) { + throw new RuntimeException("Metadata repository must be a directory, please remove regular file at: " + destinationRoot); + } + try { + Files.createDirectories(destinationRoot); + } catch (IOException e) { + throw new RuntimeException(e); } + if (metadataRepositoryConfiguration.getLocalPath() != null) { Path localPath = metadataRepositoryConfiguration.getLocalPath().toPath(); - repoPath = unzipLocalMetadata(localPath); - } else if (metadataRepositoryConfiguration.getUrl() != null) { - Optional download = downloadMetadata(metadataRepositoryConfiguration.getUrl()); - if (download.isPresent()) { - logger.info("Downloaded GraalVM reachability metadata repository from " + metadataRepositoryConfiguration.getUrl()); - repoPath = unzipLocalMetadata(download.get()); + Path destination = outputDirectory.toPath().resolve(FileUtils.hashFor(localPath.toUri())); + repoPath = unzipLocalMetadata(localPath, destination); + } else { + URL targetUrl = metadataRepositoryConfiguration.getUrl(); + if (targetUrl == null) { + String version = metadataRepositoryConfiguration.getVersion(); + if (version == null) { + version = SharedConstants.METADATA_REPO_DEFAULT_VERSION; + } + String metadataUrl = String.format(METADATA_REPO_URL_TEMPLATE, version); + try { + targetUrl = new URI(metadataUrl).toURL(); + metadataRepositoryConfiguration.setUrl(targetUrl); + } catch (URISyntaxException | MalformedURLException e) { + throw new RuntimeException(e); + } + } + Path destination; + try { + destination = destinationRoot.resolve(FileUtils.hashFor(targetUrl.toURI())); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + if (Files.exists(destination)) { + repoPath = destination; + } else { + Optional download = downloadMetadata(targetUrl, destination); + if (download.isPresent()) { + logger.info("Downloaded GraalVM reachability metadata repository from " + targetUrl); + repoPath = unzipLocalMetadata(download.get(), destination); + } } } @@ -522,15 +549,13 @@ protected Optional getMetadataVersion(Artifact dependency) { } } - protected Optional downloadMetadata(URL url) { - Path destination = outputDirectory.toPath().resolve("graalvm-reachability-metadata"); + protected Optional downloadMetadata(URL url, Path destination) { return FileUtils.download(url, destination, logger::error); } - protected Path unzipLocalMetadata(Path localPath) { + protected Path unzipLocalMetadata(Path localPath, Path destination) { if (Files.exists(localPath)) { if (FileUtils.isZip(localPath)) { - Path destination = outputDirectory.toPath().resolve("graalvm-reachability-metadata"); if (!Files.exists(destination) && !destination.toFile().mkdirs()) { throw new RuntimeException("Failed creating destination directory"); } diff --git a/samples/java-application-with-custom-packaging/pom.xml b/samples/java-application-with-custom-packaging/pom.xml index a1f790d91..b6f65cdda 100644 --- a/samples/java-application-with-custom-packaging/pom.xml +++ b/samples/java-application-with-custom-packaging/pom.xml @@ -61,7 +61,7 @@ 3.3.4 org.graalvm.demo.Application netty - 0.9.12-SNAPSHOT + 0.9.13-SNAPSHOT diff --git a/samples/java-application-with-custom-tests/gradle.properties b/samples/java-application-with-custom-tests/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/java-application-with-custom-tests/gradle.properties +++ b/samples/java-application-with-custom-tests/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/java-application-with-extra-sourceset/gradle.properties b/samples/java-application-with-extra-sourceset/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/java-application-with-extra-sourceset/gradle.properties +++ b/samples/java-application-with-extra-sourceset/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/java-application-with-reflection/build.gradle b/samples/java-application-with-reflection/build.gradle index c36340782..c5f00982a 100644 --- a/samples/java-application-with-reflection/build.gradle +++ b/samples/java-application-with-reflection/build.gradle @@ -84,7 +84,6 @@ graalvmNative { binaries { test { verbose = true - buildArgs('--allow-incomplete-classpath') } } } diff --git a/samples/java-application-with-reflection/gradle.properties b/samples/java-application-with-reflection/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/java-application-with-reflection/gradle.properties +++ b/samples/java-application-with-reflection/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/java-application-with-reflection/pom.xml b/samples/java-application-with-reflection/pom.xml index ab4f5934e..f9a54145d 100644 --- a/samples/java-application-with-reflection/pom.xml +++ b/samples/java-application-with-reflection/pom.xml @@ -52,8 +52,8 @@ 1.8 UTF-8 5.8.1 - 0.9.12 - 0.9.12 + 0.9.13 + 0.9.13 example-app org.graalvm.demo.Application diff --git a/samples/java-application-with-resources/gradle.properties b/samples/java-application-with-resources/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/java-application-with-resources/gradle.properties +++ b/samples/java-application-with-resources/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/java-application-with-resources/pom.xml b/samples/java-application-with-resources/pom.xml index b79e6954a..454776d0f 100644 --- a/samples/java-application-with-resources/pom.xml +++ b/samples/java-application-with-resources/pom.xml @@ -51,9 +51,9 @@ 1.8 UTF-8 - 0.9.12 + 0.9.13 5.8.1 - 0.9.12 + 0.9.13 example-app org.graalvm.demo.Application diff --git a/samples/java-application-with-tests/gradle.properties b/samples/java-application-with-tests/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/java-application-with-tests/gradle.properties +++ b/samples/java-application-with-tests/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/java-application-with-tests/pom.xml b/samples/java-application-with-tests/pom.xml index fa76f1be9..009a4100c 100644 --- a/samples/java-application-with-tests/pom.xml +++ b/samples/java-application-with-tests/pom.xml @@ -52,8 +52,8 @@ 1.8 UTF-8 5.8.1 - 0.9.12 - 0.9.12 + 0.9.13 + 0.9.13 example-app org.graalvm.demo.Application diff --git a/samples/java-application/gradle.properties b/samples/java-application/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/java-application/gradle.properties +++ b/samples/java-application/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/java-application/pom.xml b/samples/java-application/pom.xml index beff61e11..f53ae5981 100644 --- a/samples/java-application/pom.xml +++ b/samples/java-application/pom.xml @@ -51,8 +51,8 @@ 1.8 UTF-8 - 0.9.12 - 0.9.12 + 0.9.13 + 0.9.13 example-app org.graalvm.demo.Application diff --git a/samples/java-library/gradle.properties b/samples/java-library/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/java-library/gradle.properties +++ b/samples/java-library/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/java-library/pom.xml b/samples/java-library/pom.xml index 16446c9ee..e38bb3b1e 100644 --- a/samples/java-library/pom.xml +++ b/samples/java-library/pom.xml @@ -51,8 +51,8 @@ 1.8 UTF-8 - 0.9.12 - 0.9.12 + 0.9.13 + 0.9.13 java-library diff --git a/samples/kotlin-application-with-tests/gradle.properties b/samples/kotlin-application-with-tests/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/kotlin-application-with-tests/gradle.properties +++ b/samples/kotlin-application-with-tests/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/metadata-repo-integration/.gitignore b/samples/metadata-repo-integration/.gitignore new file mode 100644 index 000000000..249cda967 --- /dev/null +++ b/samples/metadata-repo-integration/.gitignore @@ -0,0 +1 @@ +/data \ No newline at end of file diff --git a/samples/metadata-repo-integration/build.gradle b/samples/metadata-repo-integration/build.gradle new file mode 100644 index 000000000..426b1aae6 --- /dev/null +++ b/samples/metadata-repo-integration/build.gradle @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +plugins { + id 'application' + id 'org.graalvm.buildtools.native' +} + +repositories { + mavenCentral() +} + +application { + mainClass.set('org.graalvm.example.H2Example') +} + +String h2_version = getProperty("h2.version") + + +dependencies { + implementation("com.h2database:h2:$h2_version") +} + +graalvmNative { + agent { + defaultMode = "standard" + } + metadataRepository { + enabled = true + } +} diff --git a/samples/metadata-repo-integration/gradle.properties b/samples/metadata-repo-integration/gradle.properties new file mode 100644 index 000000000..4d1f205d7 --- /dev/null +++ b/samples/metadata-repo-integration/gradle.properties @@ -0,0 +1,2 @@ +native.gradle.plugin.version = 0.9.13 +h2.version = 2.1.210 diff --git a/samples/metadata-repo-integration/pom.xml b/samples/metadata-repo-integration/pom.xml new file mode 100644 index 000000000..0edcff4e2 --- /dev/null +++ b/samples/metadata-repo-integration/pom.xml @@ -0,0 +1,192 @@ + + + + + 4.0.0 + + org.graalvm.buildtools.examples + maven + 1.0.0-SNAPSHOT + + + 1.8 + UTF-8 + 0.9.13 + 0.9.13 + 2.1.210 + h2-demo + org.graalvm.example.H2Example + + + + + com.h2database + h2 + ${h2.version} + + + + + + native + + + + org.graalvm.buildtools + native-maven-plugin + ${native.maven.plugin.version} + true + + + build-native + + build + + package + + + + + + true + + + + + + + + + nativeVersioned + + + + org.graalvm.buildtools + native-maven-plugin + ${native.maven.plugin.version} + true + + + build-native + + build + + package + + + + + + true + 0.1.0 + + + + + + + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + 1.8 + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.2 + + + + true + ${mainClass} + + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + + java + + java + + + ${mainClass} + + + + native + + exec + + + ${project.build.directory}/${imageName} + ${project.build.directory} + + + + + + + + diff --git a/samples/metadata-repo-integration/settings.gradle b/samples/metadata-repo-integration/settings.gradle new file mode 100644 index 000000000..5a909b526 --- /dev/null +++ b/samples/metadata-repo-integration/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + plugins { + id 'org.graalvm.buildtools.native' version getProperty('native.gradle.plugin.version') + } + repositories { + mavenCentral() + gradlePluginPortal() + } +} + +rootProject.name = 'h2-demo' diff --git a/samples/metadata-repo-integration/src/main/java/org/graalvm/example/H2Example.java b/samples/metadata-repo-integration/src/main/java/org/graalvm/example/H2Example.java new file mode 100644 index 000000000..b743611ae --- /dev/null +++ b/samples/metadata-repo-integration/src/main/java/org/graalvm/example/H2Example.java @@ -0,0 +1,80 @@ +package org.graalvm.example; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + + +public class H2Example { + + public static final String JDBC_CONNECTION_URL = "jdbc:h2:./data/test"; + + public static void main(String[] args) throws Exception { + // Cleanup + withConnection(JDBC_CONNECTION_URL, connection -> { + connection.prepareStatement("DROP TABLE IF EXISTS customers").execute(); + connection.commit(); + }); + + Set customers = Set.of("Lord Archimonde", "Arthur", "Gilbert", "Grug"); + + System.out.println("=== Inserting the following customers in the database: "); + printCustomers(customers); + + // Insert data + withConnection(JDBC_CONNECTION_URL, connection -> { + connection.prepareStatement("CREATE TABLE customers(id INTEGER AUTO_INCREMENT, name VARCHAR)").execute(); + PreparedStatement statement = connection.prepareStatement("INSERT INTO customers(name) VALUES (?)"); + for (String customer : customers) { + statement.setString(1, customer); + statement.executeUpdate(); + } + connection.commit(); + }); + + System.out.println(""); + System.out.println("=== Reading customers from the database."); + System.out.println(""); + + Set savedCustomers = new HashSet<>(); + // Read data + withConnection(JDBC_CONNECTION_URL, connection -> { + try (ResultSet resultSet = connection.prepareStatement("SELECT * FROM customers").executeQuery()) { + while (resultSet.next()) { + savedCustomers.add(resultSet.getObject(2, String.class)); + } + } + }); + + System.out.println("=== Customers in the database: "); + printCustomers(savedCustomers); + } + + private static void printCustomers(Set customers) { + List customerList = new ArrayList<>(customers); + customerList.sort(Comparator.naturalOrder()); + int i = 0; + for (String customer : customerList) { + System.out.println((i + 1) + ". " + customer); + i++; + } + } + + private static void withConnection(String url, ConnectionCallback callback) throws SQLException { + try (Connection connection = DriverManager.getConnection(url)) { + connection.setAutoCommit(false); + callback.run(connection); + } + } + + private interface ConnectionCallback { + void run(Connection connection) throws SQLException; + } +} diff --git a/samples/multi-project-with-tests/gradle.properties b/samples/multi-project-with-tests/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/multi-project-with-tests/gradle.properties +++ b/samples/multi-project-with-tests/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/native-config-integration/config-directory/org/graalvm/internal/library-with-reflection/1/reflect-config.json b/samples/native-config-integration/config-directory/org.graalvm.internal/library-with-reflection/1/reflect-config.json similarity index 100% rename from samples/native-config-integration/config-directory/org/graalvm/internal/library-with-reflection/1/reflect-config.json rename to samples/native-config-integration/config-directory/org.graalvm.internal/library-with-reflection/1/reflect-config.json diff --git a/samples/native-config-integration/config-directory/org/graalvm/internal/library-with-reflection/index.json b/samples/native-config-integration/config-directory/org.graalvm.internal/library-with-reflection/index.json similarity index 100% rename from samples/native-config-integration/config-directory/org/graalvm/internal/library-with-reflection/index.json rename to samples/native-config-integration/config-directory/org.graalvm.internal/library-with-reflection/index.json diff --git a/samples/native-config-integration/gradle.properties b/samples/native-config-integration/gradle.properties index ce717b95b..8423039b8 100644 --- a/samples/native-config-integration/gradle.properties +++ b/samples/native-config-integration/gradle.properties @@ -1,3 +1,3 @@ -native.gradle.plugin.version = 0.9.12 +native.gradle.plugin.version = 0.9.13 junit.jupiter.version = 5.8.1 junit.platform.version = 1.8.1 diff --git a/samples/native-config-integration/pom.xml b/samples/native-config-integration/pom.xml index 00d276b37..061d8da99 100644 --- a/samples/native-config-integration/pom.xml +++ b/samples/native-config-integration/pom.xml @@ -51,8 +51,8 @@ 1.8 UTF-8 - 0.9.12 - 0.9.12 + 0.9.13 + 0.9.13 example-app org.graalvm.example.Application @@ -151,19 +151,19 @@ metadataLocal - org.graalvm.buildtools native-maven-plugin ${native.maven.plugin.version} + true ${project.basedir}/config-directory + - @@ -227,12 +227,12 @@ metadataExclude - org.graalvm.buildtools native-maven-plugin ${native.maven.plugin.version} + true ${project.basedir}/config-directory @@ -244,9 +244,9 @@ + - @@ -254,13 +254,13 @@ metadataForceVersion - org.graalvm.buildtools native-maven-plugin ${native.maven.plugin.version} false + true ${project.basedir}/config-directory @@ -272,9 +272,9 @@ + - @@ -341,20 +341,20 @@ - org.graalvm.buildtools native-maven-plugin ${native.maven.plugin.version} false + true ${metadata.url} + - diff --git a/settings.gradle.kts b/settings.gradle.kts index 4edd83d39..4e01a2d6e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -48,7 +48,7 @@ rootProject.name = "native-build-tools" includeBuild("common/junit-platform-native") includeBuild("common/utils") -includeBuild("common/jvm-reachability-metadata") +includeBuild("common/graalvm-reachability-metadata") includeBuild("native-gradle-plugin") includeBuild("native-maven-plugin") includeBuild("docs")