From d9d3b58cfc66e1c47731b60026b73bab26eed920 Mon Sep 17 00:00:00 2001 From: Ling Hengqian Date: Tue, 26 Sep 2023 13:58:45 +0800 Subject: [PATCH] Fixes `native:metadata-copy` Maven Goal not available in Spring Boot Starter (#571) --- .github/workflows/ci.yml | 8 +- CONTRIBUTING.md | 23 +-- .../pom.xml | 16 +- .../jni-config.json | 5 - .../reflect-config.json | 170 ---------------- .../resource-config.json | 8 - .../resource-config.json | 34 +++- native-image/extra-filter.json | 8 + pom.xml | 192 ++++++++++-------- 9 files changed, 162 insertions(+), 302 deletions(-) delete mode 100644 dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/resource-config.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72f2b08..918d58c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ env: MAVEN_OPTS: -Dhttps.protocols=TLSv1.2 -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true jobs: - # We only execute nativeTest on `dynamic-datasource-spring-boot3-starter`, since only Spring Boot OSS 3 support provides support for GraalVM Native Image + # We only execute nativeTest on `dynamic-datasource-spring-boot3-starter`, since only Spring Boot OSS 3 provides support for GraalVM Native Image test-graalvm-ce-ci: name: NativeTest CI - GraalVM CE ${{ matrix.java-version }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} @@ -33,7 +33,7 @@ jobs: strategy: matrix: os: [ ubuntu-latest ] - java-version: [ '17.0.8' ] + java-version: [ '21' ] steps: - uses: actions/checkout@v3 - uses: graalvm/setup-graalvm@v1 @@ -44,7 +44,7 @@ jobs: cache: 'maven' - name: Build Spring Boot Starter 3 test with Maven run: | - ./mvnw -am -pl dynamic-datasource-spring-boot3-starter -PnativeTestInSpringBoot -T1C -B -e clean test + ./mvnw -PnativeTestInSpringBoot -T1C -B -e clean test test-hotspot-jdk-ci: name: Test CI - JDK ${{ matrix.java-version }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} @@ -52,7 +52,7 @@ jobs: strategy: matrix: os: [ ubuntu-latest ] - java-version: [ '17', '20' ] + java-version: [ '17', '21-ea' ] steps: - uses: actions/checkout@v3 - name: Setup java diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 506cd9a..11f5b27 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,13 +41,13 @@ failed to discover tests 的测试库。 sudo apt install unzip zip curl sed -y curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" -sdk install java 17.0.8-graalce -sdk use java 17.0.8-graalce +sdk install java 21-graalce +sdk use java 21-graalce sudo apt-get install build-essential libz-dev zlib1g-dev -y git clone git@github.com:baomidou/dynamic-datasource.git cd ./dynamic-datasource/ -./mvnw -am -pl dynamic-datasource-spring-boot3-starter -PnativeTestInSpringBoot -T1C -B clean test +./mvnw -PnativeTestInSpringBoot -T1C -e clean test ``` 贡献者在提交 PR 后,位于 Github Actions 的 CI 将进行此验证。如果 nativeTest 执行失败,请跳转到[本文的 2.2 一节](./CONTRIBUTING.md)。 @@ -69,8 +69,6 @@ System Property 屏蔽部分单元测试在 GraalVM Native Image 下运行。 调整 Maven Profile 和 GraalVM Tracing Agent 的 Filter 链。 以下命令仅为 `dynamic-datasource-spring-boot3-starter` 生成 Conditioanl 形态的 GraalVM Reachability Metadata 的一个举例。 -在 https://github.com/graalvm/native-build-tools/issues/500 关闭之前,你都需要手动调整 `native-image-configure` 的 `input-dir` -为 `./mvnw -PgenerateMetadata -DskipNativeTests -e clean test` 真实的输出目录。 对于测试类和测试文件独立使用的 GraalVM Reachability Metadata,贡献者应该放置到相关子模块对应的 `${project.basedir}/src/test/resources/META-INF/native-image/${project.artifactId}-test-metadata/` 文件夹下。`${}` 内为 @@ -78,20 +76,9 @@ POM 4.0 的常规系统变量,自行替换。 ```bash git clone git@github.com:baomidou/dynamic-datasource.git - cd ./dynamic-datasource/ - -./mvnw -PgenerateMetadata -DskipNativeTests -e clean test - -mkdir -p "./dynamic-datasource-spring-boot3-starter/src/test/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/" - -native-image-configure generate-conditional\ - --user-code-filter="./native-image/user-code-filter.json"\ - --class-name-filter="./native-image/extra-filter.json"\ - --input-dir="./dynamic-datasource-spring-boot3-starter/target/native/agent-output/test/session-45270-20230907T013541Z/"\ - --output-dir="./dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/" - -./mvnw -am -pl dynamic-datasource-spring-boot3-starter -PnativeTestInSpringBoot -T1C -B -e clean test +./mvnw -PgenerateMetadata -DskipNativeTests -e -T1C clean test native:metadata-copy +./mvnw -PnativeTestInSpringBoot -T1C -e clean test ``` 请手动删除无任何具体条目的 JSON 文件。 diff --git a/dynamic-datasource-spring-boot3-starter/pom.xml b/dynamic-datasource-spring-boot3-starter/pom.xml index 80c27e0..65551af 100644 --- a/dynamic-datasource-spring-boot3-starter/pom.xml +++ b/dynamic-datasource-spring-boot3-starter/pom.xml @@ -60,4 +60,18 @@ test - \ No newline at end of file + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.graalvm.buildtools + native-maven-plugin + ${native-maven-plugin.version} + + + + diff --git a/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/jni-config.json b/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/jni-config.json index 3d0adb8..6ad66f5 100644 --- a/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/jni-config.json +++ b/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/jni-config.json @@ -6,10 +6,5 @@ { "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, "name":"[Lcom.sun.management.internal.DiagnosticCommandInfo;" -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.util.Arrays", - "methods":[{"name":"asList","parameterTypes":["java.lang.Object[]"] }] } ] diff --git a/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/reflect-config.json b/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/reflect-config.json index 0ab0bb5..13a9112 100644 --- a/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/reflect-config.json +++ b/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/reflect-config.json @@ -274,175 +274,5 @@ "condition":{"typeReachable":"com.baomidou.dynamic.datasource.DynamicRoutingDataSource"}, "name":"com.baomidou.dynamic.datasource.strategy.LoadBalanceDynamicDataSourceStrategy", "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"com.ibm.icu.text.Collator" -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.toolkit.DsConfigUtil"}, - "name":"java.beans.PropertyVetoException" -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.DynamicRoutingDataSource"}, - "name":"java.io.Closeable", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Boolean", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Byte", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Character", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.DynamicRoutingDataSource"}, - "name":"java.lang.Cloneable", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Deprecated", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Double", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Float", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Integer", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationAdvisor$AnnotationMethodPoint$AnnotationMethodMatcher"}, - "name":"java.lang.Iterable", - "methods":[{"name":"forEach","parameterTypes":["java.util.function.Consumer"] }, {"name":"spliterator","parameterTypes":[] }] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Long", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.DynamicRoutingDataSource"}, - "name":"java.lang.Object", - "queryAllDeclaredMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationAdvisor$AnnotationMethodPoint$AnnotationMethodMatcher"}, - "name":"java.lang.Object", - "methods":[{"name":"equals","parameterTypes":["java.lang.Object"] }, {"name":"getClass","parameterTypes":[] }, {"name":"hashCode","parameterTypes":[] }, {"name":"notify","parameterTypes":[] }, {"name":"notifyAll","parameterTypes":[] }, {"name":"toString","parameterTypes":[] }, {"name":"wait","parameterTypes":[] }, {"name":"wait","parameterTypes":["long"] }, {"name":"wait","parameterTypes":["long","int"] }] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.toolkit.DsConfigUtil"}, - "name":"java.lang.Object", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.toolkit.DsConfigUtil"}, - "name":"java.lang.ObjectBeanInfo" -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.toolkit.DsConfigUtil"}, - "name":"java.lang.ObjectCustomizer" -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Short", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.StackTraceElement", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.String", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.lang.Void", - "fields":[{"name":"TYPE"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.math.BigDecimal" -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.math.BigInteger" -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.sql.SQLException", - "fields":[{"name":"next"}] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.util.Date" -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.util.PropertyPermission", - "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.util.logging.LogManager", - "methods":[{"name":"getLoggingMXBean","parameterTypes":[] }] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"java.util.logging.LoggingMXBean", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.DynamicRoutingDataSource"}, - "name":"javax.naming.Referenceable", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationAdvisor$AnnotationMethodPoint$AnnotationMethodMatcher"}, - "name":"javax.sql.CommonDataSource", - "queryAllPublicMethods":true, - "methods":[{"name":"createShardingKeyBuilder","parameterTypes":[] }] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.DynamicRoutingDataSource"}, - "name":"javax.sql.ConnectionPoolDataSource", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.DynamicRoutingDataSource"}, - "name":"javax.sql.DataSource", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationAdvisor$AnnotationMethodPoint$AnnotationMethodMatcher"}, - "name":"javax.sql.DataSource", - "queryAllPublicMethods":true, - "methods":[{"name":"createConnectionBuilder","parameterTypes":[] }] -}, -{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "name":"sun.security.provider.SHA2$SHA256", - "methods":[{"name":"","parameterTypes":[] }] } ] diff --git a/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/resource-config.json b/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/resource-config.json deleted file mode 100644 index 23304c6..0000000 --- a/dynamic-datasource-spring-boot3-starter/src/main/resources/META-INF/native-image/com.baomidou/dynamic-datasource-spring-boot3-starter/resource-config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "resources":{ - "includes":[{ - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "pattern":"\\QMETA-INF/services/java.sql.Driver\\E" - }]}, - "bundles":[] -} diff --git a/dynamic-datasource-spring-boot3-starter/src/test/resources/META-INF/native-image/dynamic-datasource-spring-boot3-starter-test-metadata/resource-config.json b/dynamic-datasource-spring-boot3-starter/src/test/resources/META-INF/native-image/dynamic-datasource-spring-boot3-starter-test-metadata/resource-config.json index c3edc40..79a5354 100644 --- a/dynamic-datasource-spring-boot3-starter/src/test/resources/META-INF/native-image/dynamic-datasource-spring-boot3-starter-test-metadata/resource-config.json +++ b/dynamic-datasource-spring-boot3-starter/src/test/resources/META-INF/native-image/dynamic-datasource-spring-boot3-starter-test-metadata/resource-config.json @@ -1,17 +1,29 @@ { "resources":{ - "includes":[{ + "includes":[{ "condition":{"typeReachable":"com.baomidou.dynamic.datasource.fixture.v3.NestDataSourceTest"}, "pattern":"\\Qdb/add-remove-datasource.sql\\E" - }, { - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator"}, - "pattern":"\\QMETA-INF/druid-driver.properties\\E" - }, { - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator"}, - "pattern":"\\QMETA-INF/druid-filter.properties\\E" - }, { - "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, - "pattern":"\\Qorg/h2/util/data.zip\\E" - }]}, + }, { + "condition":{"typeReachable":"com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator"}, + "pattern":"\\QMETA-INF/druid-driver.properties\\E" + }, { + "condition":{"typeReachable":"com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator"}, + "pattern":"\\QMETA-INF/druid-filter.properties\\E" + }, { + "condition":{"typeReachable":"com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator"}, + "pattern":"\\QMETA-INF/services/com.alibaba.druid.filter.Filter\\E" + }, { + "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, + "pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E" + }, { + "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, + "pattern":"\\QMETA-INF/services/java.sql.Driver\\E" + }, { + "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, + "pattern":"\\Qorg/h2/util/data.zip\\E" + }, { + "condition":{"typeReachable":"com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider"}, + "pattern":"jdk.jfr:\\Qjdk/jfr/internal/query/view.ini\\E" + }]}, "bundles":[] } diff --git a/native-image/extra-filter.json b/native-image/extra-filter.json index bab6fa6..d4ea3b7 100644 --- a/native-image/extra-filter.json +++ b/native-image/extra-filter.json @@ -6,6 +6,14 @@ {"excludeClasses": "com.sun.management.**"}, {"excludeClasses": "sun.management.**"}, {"excludeClasses": "javax.management.**"}, + {"excludeClasses": "java.**"}, + {"includeClasses": "java.util.Properties"}, + {"includeClasses": "java.lang.Thread"}, + {"excludeClasses": "sun.misc.**"}, + {"excludeClasses": "sun.security.**"}, + {"excludeClasses": "com.ibm.icu.text.**"}, + {"excludeClasses": "javax.naming.**"}, + {"excludeClasses": "javax.sql.**"}, {"excludeClasses": "org.h2.**"}, {"excludeClasses": "oracle.ucp.**"}, {"excludeClasses": "org.apache.tomcat.jdbc.**"}, diff --git a/pom.xml b/pom.xml index bcbe4a3..7523818 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 2.9.0 3.9.1 1.4.2 - 1.18.28 + 1.18.30 2.2.222 4.0.6 5.10.0 @@ -75,7 +75,7 @@ 4.2 3.1.0 1.6.13 - 0.9.26 + 0.9.27 @@ -345,98 +345,120 @@ generateMetadata - 17 + 21 - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - com.baomidou.dynamic.datasource.fixture.v1.** - - - - - org.graalvm.buildtools - native-maven-plugin - ${native-maven-plugin.version} - true - - - build-native - - compile-no-fork - - package - - - test-native - - test - - test - - - - - true - Conditional - - - ${user.dir}/native-image/user-code-filter.json - ${user.dir}/native-image/extra-filter.json - true - - - - - - + + + + maven-surefire-plugin + + + com.baomidou.dynamic.datasource.fixture.v3.** + + + + + org.graalvm.buildtools + native-maven-plugin + ${native-maven-plugin.version} + true + + + build-native + + compile-no-fork + + package + + + test-native + + test + + test + + + + + true + Conditional + + + ${user.dir}/native-image/user-code-filter.json + + ${user.dir}/native-image/extra-filter.json + + true + + + + + main + + false + + ${project.basedir}/src/main/resources/META-INF/native-image/${project.groupId}/${project.artifactId}/ + + + + + + + nativeTestInSpringBoot - 17 + 21 - - - org.springframework.boot - spring-boot-maven-plugin - - - process-test-aot - - process-test-aot - - - - - - org.graalvm.buildtools - native-maven-plugin - true - - ${project.build.outputDirectory} - - true - - - - - native-test - - test - - - - - + + + + maven-surefire-plugin + + + com.baomidou.dynamic.datasource.fixture.v3.** + + + + + org.springframework.boot + spring-boot-maven-plugin + + + process-test-aot + + process-test-aot + + + + + + org.graalvm.buildtools + native-maven-plugin + ${native-maven-plugin.version} + true + + ${project.build.outputDirectory} + + true + + + + + test-native + + test + + test + + + + +