diff --git a/.gitignore b/.gitignore index 5e82683..31668e0 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,4 @@ build/ /spring-test/target /spring-test/.idea /wxdgaming-mmoarpg/.idea +/gvm/native-image diff --git a/gvm/.idea/compiler.xml b/gvm/.idea/compiler.xml index e8a2320..17f09ef 100644 --- a/gvm/.idea/compiler.xml +++ b/gvm/.idea/compiler.xml @@ -1,6 +1,7 @@ + - - - \ No newline at end of file diff --git a/gvm/.idea/misc.xml b/gvm/.idea/misc.xml index dc94c0e..4b661a5 100644 --- a/gvm/.idea/misc.xml +++ b/gvm/.idea/misc.xml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/gvm/.idea/modules.xml b/gvm/.idea/modules.xml new file mode 100644 index 0000000..2a9cf5e --- /dev/null +++ b/gvm/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gvm/a/src/main/java/gvm/a/Main.java b/gvm/a/src/main/java/gvm/test/a/Main.java similarity index 86% rename from gvm/a/src/main/java/gvm/a/Main.java rename to gvm/a/src/main/java/gvm/test/a/Main.java index 39d2b9d..0dc17d1 100644 --- a/gvm/a/src/main/java/gvm/a/Main.java +++ b/gvm/a/src/main/java/gvm/test/a/Main.java @@ -1,4 +1,4 @@ -package gvm.a; +package gvm.test.a; public class Main { diff --git a/gvm/a/src/main/java/gvm/a/ReflectContext.java b/gvm/a/src/main/java/gvm/test/a/ReflectContext.java similarity index 93% rename from gvm/a/src/main/java/gvm/a/ReflectContext.java rename to gvm/a/src/main/java/gvm/test/a/ReflectContext.java index ea5a384..525dcef 100644 --- a/gvm/a/src/main/java/gvm/a/ReflectContext.java +++ b/gvm/a/src/main/java/gvm/test/a/ReflectContext.java @@ -1,4 +1,4 @@ -package gvm.a; +package gvm.test.a; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; @@ -19,6 +19,7 @@ import java.util.function.Consumer; import java.util.function.Predicate; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.stream.Collectors; import java.util.stream.Stream; @@ -254,7 +255,7 @@ public class ReflectContext { .filter(v -> !filterAbstract || !Modifier.isAbstract(v.getModifiers())) .filter(v -> !filterEnum || !v.isEnum()) .filter(v -> !v.isAnnotation()) - .toList(); + .collect(Collectors.toList()); return new ReflectContext(list); } @@ -274,23 +275,28 @@ public class ReflectContext { url = resources.nextElement(); if (url != null) { String type = url.getProtocol(); - String urlPath = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8); + String urlPath = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8.toString()); System.out.println("url info:" + type + " - " + urlPath); switch (type) { - case "file" -> { + case "file": String dir = urlPath.substring(0, urlPath.lastIndexOf(packagePath)); findClassByFile(dir, urlPath, consumer); - } - case "jar", "zip" -> findClassByJar(urlPath, consumer); - case "resource" -> { + break; + case "jar": + case "zip": + findClassByJar(urlPath, consumer); + break; + case "resource": getResources() .stream() .filter(v -> v.startsWith(packageName)) .forEach(v -> { loadClass(v, consumer); }); - } - case null, default -> System.out.println("未知类型:" + type + " - " + urlPath); + break; + default: + System.out.println("未知类型:" + type + " - " + urlPath); + break; } } else { findClassByJars( @@ -345,7 +351,12 @@ public class ReflectContext { if (urls != null) { for (URL url : urls) { - String urlPath = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8); + String urlPath = null; + try { + urlPath = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8.toString()); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } // 不必搜索classes文件夹 if (urlPath.endsWith("classes/")) { continue; diff --git a/gvm/b/dependency-reduced-pom.xml b/gvm/b/dependency-reduced-pom.xml index df28bbb..31876ce 100644 --- a/gvm/b/dependency-reduced-pom.xml +++ b/gvm/b/dependency-reduced-pom.xml @@ -1,59 +1,15 @@ - - - gvm - gvm - 1.0-SNAPSHOT - - 4.0.0 - b - - - - maven-shade-plugin - 3.6.0 - - - package - - shade - - - - - gvm.b.Main - - - - - gvm - shaded.yourcompany.yourapp - - - - - - - - - - - junit - junit - 4.13.2 - test - - - hamcrest-core - org.hamcrest - - - - - org.graalvm.sdk - graal-sdk - 24.0.1 - provided - - + + + gvm + gvm + 1.0-SNAPSHOT + + 4.0.0 + b + + + + diff --git a/gvm/b/src/main/java/gvm/b/Main.java b/gvm/b/src/main/java/gvm/test/b/Main.java similarity index 72% rename from gvm/b/src/main/java/gvm/b/Main.java rename to gvm/b/src/main/java/gvm/test/b/Main.java index 55fc64e..d410011 100644 --- a/gvm/b/src/main/java/gvm/b/Main.java +++ b/gvm/b/src/main/java/gvm/test/b/Main.java @@ -1,9 +1,9 @@ -package gvm.b; +package gvm.test.b; public class Main { public void point() throws Exception { - gvm.a.Main.print(); + gvm.test.a.Main.print(); System.out.println(Main.class.getName() + " Hello world!"); } diff --git a/gvm/c/pom.xml b/gvm/c/pom.xml index 5f6a9fb..0df84a2 100644 --- a/gvm/c/pom.xml +++ b/gvm/c/pom.xml @@ -57,24 +57,24 @@ true lib/ false - gvm.c.Main + gvm.test.c.Main - - - net.roseboy - classfinal-maven-plugin - - # - gvm - - - - - + + + + + + + + + + + + diff --git a/gvm/c/src/main/java/gvm/c/Main.java b/gvm/c/src/main/java/gvm/test/c/Main.java similarity index 76% rename from gvm/c/src/main/java/gvm/c/Main.java rename to gvm/c/src/main/java/gvm/test/c/Main.java index eda2692..dc7b201 100644 --- a/gvm/c/src/main/java/gvm/c/Main.java +++ b/gvm/c/src/main/java/gvm/test/c/Main.java @@ -1,20 +1,21 @@ -package gvm.c; +package gvm.test.c; -import gvm.a.ReflectContext; +import gvm.test.a.ReflectContext; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.lang.reflect.Method; +import java.net.URL; import java.util.ArrayList; +import java.util.Enumeration; public class Main { public static void main(String[] args) throws Exception { System.setProperty("jdk.attach.allowAttachSelf", "false"); System.out.println("=================start================="); - ClassLoader classLoader = Main.class.getClassLoader(); // classLoader = RemoteClassLoader.build( // Main.class.getClassLoader(), @@ -22,16 +23,24 @@ public class Main { // "http://localhost/qj5/b.jar" // ); - ReflectContext.Builder gvm = ReflectContext.Builder.of(classLoader, "gvm"); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + System.out.println(classLoader); + + Enumeration urls = classLoader.getResources("gvm/test"); + while (urls.hasMoreElements()) { + URL next = urls.nextElement(); + System.out.println(next); + } + + ReflectContext.Builder gvm = ReflectContext.Builder.of(classLoader, "gvm.test"); ArrayList resources = gvm.getResources(); gvm .build() .classStream() .forEach(c -> System.out.println("ReflectContext:" + c)); - System.out.println(classLoader); - Class aClass = classLoader.loadClass("gvm.b.Main"); + Class aClass = classLoader.loadClass("gvm.test.b.Main"); if (aClass != null) { System.out.println(aClass.getClassLoader().hashCode()); System.out.println(aClass.hashCode()); diff --git a/gvm/c/src/main/java/gvm/c/NativeClassAction.java b/gvm/c/src/main/java/gvm/test/c/NativeClassAction.java similarity index 94% rename from gvm/c/src/main/java/gvm/c/NativeClassAction.java rename to gvm/c/src/main/java/gvm/test/c/NativeClassAction.java index c3fddb8..d67c30e 100644 --- a/gvm/c/src/main/java/gvm/c/NativeClassAction.java +++ b/gvm/c/src/main/java/gvm/test/c/NativeClassAction.java @@ -1,8 +1,8 @@ -package gvm.c; +package gvm.test.c; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; -import gvm.a.ReflectContext; +import gvm.test.a.ReflectContext; import java.io.File; import java.io.IOException; @@ -25,7 +25,7 @@ public class NativeClassAction { ArrayList classNames = new ArrayList<>(); ReflectContext.Builder - .of(Thread.currentThread().getContextClassLoader(), "gvm").build() + .of(Thread.currentThread().getContextClassLoader(), "gvm.test").build() .classStream() .forEach(c -> { System.out.println("ReflectContext:" + c); diff --git a/gvm/c/src/main/java/gvm/test/c/NativeMain.java b/gvm/c/src/main/java/gvm/test/c/NativeMain.java new file mode 100644 index 0000000..17aa683 --- /dev/null +++ b/gvm/c/src/main/java/gvm/test/c/NativeMain.java @@ -0,0 +1,67 @@ +package gvm.test.c; + + +import gvm.test.a.ReflectContext; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; + +public class NativeMain { + + public static void main(String[] args) throws Exception { + System.setProperty("jdk.attach.allowAttachSelf", "false"); + System.out.println("=================start================="); + + // classLoader = RemoteClassLoader.build( + // Main.class.getClassLoader(), + // "http://localhost/qj5/a.jar", + // "http://localhost/qj5/b.jar" + // ); + + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + System.out.println(classLoader); + + Enumeration urls = classLoader.getResources("gvm/test"); + while (urls.hasMoreElements()) { + URL next = urls.nextElement(); + System.out.println(next); + } + + ReflectContext.Builder gvm = ReflectContext.Builder.of(classLoader, "gvm.test"); + ArrayList resources = gvm.getResources(); + gvm + .build() + .classStream() + .forEach(c -> System.out.println("ReflectContext:" + c)); + + + Class aClass = classLoader.loadClass("gvm.test.b.Main"); + if (aClass != null) { + System.out.println(aClass.getClassLoader().hashCode()); + System.out.println(aClass.hashCode()); + + Method point = aClass.getMethod("point"); + point.invoke(aClass.getConstructor().newInstance()); + } + System.out.println("敲入回车关闭:"); + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + reader.readLine(); + + } + + public static void files(String split, File file) { + System.out.println(split + file); + File[] files = file.listFiles(); + if (files != null) { + for (File f : files) { + files(split + "-", f); + } + } + } + +} \ No newline at end of file diff --git a/gvm/c/src/main/resources/META-INF/native-image/.lock b/gvm/c/src/main/resources/META-INF/native-image/.lock new file mode 100644 index 0000000..e6cd2d9 --- /dev/null +++ b/gvm/c/src/main/resources/META-INF/native-image/.lock @@ -0,0 +1 @@ +23056 \ No newline at end of file diff --git a/gvm/c/src/main/resources/resources.json b/gvm/c/src/main/resources/resources.json index bed25da..5b2f6d8 100644 --- a/gvm/c/src/main/resources/resources.json +++ b/gvm/c/src/main/resources/resources.json @@ -1,10 +1,10 @@ [ - "gvm.a.Main", - "gvm.a.ReflectContext", - "gvm.a.ReflectContext$Builder", - "gvm.a.ReflectContext$Builder$1", - "gvm.a.ReflectContext$Content", - "gvm.b.Main", - "gvm.c.Main", - "gvm.c.NativeClassAction" + "gvm.test.a.Main", + "gvm.test.a.ReflectContext", + "gvm.test.a.ReflectContext$Builder", + "gvm.test.a.ReflectContext$Builder$1", + "gvm.test.a.ReflectContext$Content", + "gvm.test.b.Main", + "gvm.test.c.Main", + "gvm.test.c.NativeClassAction" ] \ No newline at end of file diff --git a/gvm/c/src/test/java/action/NativeClassActionTest.java b/gvm/c/src/test/java/action/NativeClassActionTest.java new file mode 100644 index 0000000..92d0d4d --- /dev/null +++ b/gvm/c/src/test/java/action/NativeClassActionTest.java @@ -0,0 +1,56 @@ +package action; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import gvm.test.a.ReflectContext; +import org.junit.Test; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; + +/** + * 资源读取 + * + * @author: Troy.Chen(無心道, 15388152619) + * @version: 2024-07-10 09:37 + **/ +public class NativeClassActionTest { + + /** + * 通过mvn编译调用 + * mvn clean compiler test -Dtest=action.NativeClassActionTest#f1 -DfailIfNoTests=false package -f pom.xml + * @throws Exception + * @author: Troy.Chen(無心道, 15388152619) + * @version: 2024-07-12 09:56 + */ + @Test + public void f1() throws Exception { + + ArrayList classNames = new ArrayList<>(); + + ReflectContext.Builder + .of(Thread.currentThread().getContextClassLoader(), "gvm.test").build() + .classStream() + .forEach(c -> { + System.out.println("ReflectContext:" + c); + classNames.add(c.getName()); + }); + + String jsonString = JSON.toJSONString(classNames, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.PrettyFormat); + System.out.println(jsonString); + + String first = "c/src/main/resources/resources.json"; + new File(first).getParentFile().mkdirs(); + Files.write(Paths.get(first), + jsonString.getBytes(StandardCharsets.UTF_8), + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING + ); + + } + +} diff --git a/gvm/package-graalvm-image.sh b/gvm/package-graalvm-image.sh index 3b4da98..ba77aec 100644 --- a/gvm/package-graalvm-image.sh +++ b/gvm/package-graalvm-image.sh @@ -1,13 +1,11 @@ #!/bin/bash -cd c/target -pwd option="" option="${option} -H:+UnlockExperimentalVMOptions" option="${option} -H:+ReportExceptionStackTraces" option="${option} -H:-ParseRuntimeOptions" -option="${option} -H:ConfigurationFileDirectories=META-INF/native-image" +option="${option} -H:ConfigurationFileDirectories=native-image/config" option="${option} --enable-http" option="${option} --enable-https" option="${option} --no-fallback" @@ -22,6 +20,7 @@ option="${option} --initialize-at-build-time=org.apache.log4j" option="${option} --initialize-at-build-time=ch.qos.logback" option="${option} --initialize-at-build-time=io.netty" option="${option} --initialize-at-build-time=gvm" +option="${option} --initialize-at-build-time=com.alibaba" # @@ -31,6 +30,7 @@ option="${option} --initialize-at-run-time=com.lang.server.handler.FarChannelHan option="${option} --initialize-at-run-time=org.slf4j.impl.StaticLoggerBinder" option="${option} --initialize-at-run-time=io.netty" option="${option} --initialize-at-run-time=gvm" +option="${option} --initialize-at-run-time=com.alibaba" # @@ -45,13 +45,14 @@ option="${option} --trace-class-initialization=java.beans.Introspector" option="${option} --trace-class-initialization=java.beans.ThreadGroupContext" option="${option} --trace-class-initialization=ch.qos.logback" option="${option} --trace-class-initialization=gvm" +option="${option} --trace-class-initialization=com.alibaba" option="${option} -Dio.netty.tryReflectionSetAccessible=true" option="${option} --add-exports=java.base/java.nio=ALL-UNNAMED" option="${option} --add-opens java.base/java.nio=ALL-UNNAMED" -/usr/local/graalvm-jdk-21.0.3+7.1/bin/native-image $option -jar server-boot.jar graalvm-test +/usr/local/graalvm-jdk-17.0.11+7.1/bin/native-image $option -cp "c/target/lib/*" -jar c/target/server-boot.jar native-image/graalvm-test #rm -rfv lib/gvm.*-1.0-SNAPSHOT.jar -./graalvm-test \ No newline at end of file +./native-image/graalvm-test \ No newline at end of file diff --git a/gvm/package-graalvm.sh b/gvm/package-graalvm.sh index 705d21b..bf2cca5 100644 --- a/gvm/package-graalvm.sh +++ b/gvm/package-graalvm.sh @@ -1,7 +1,8 @@ #!/bin/bash # 设置JAVA_HOME环境变量 -export JAVA_HOME=/usr/local/graalvm-jdk-21.0.3+7.1 +#export JAVA_HOME=/usr/local/graalvm-jdk-17.0.11+7.1 +export JAVA_HOME=/usr/local/jdk-1.8.0_301 # 将JAVA_HOME加入到PATH变量中 export PATH=$JAVA_HOME/bin:$PATH # 打印出Java版本信息以验证设置是否成功 @@ -9,8 +10,5 @@ java -version #cd /mnt/e/work/engine712-server mvn clean package -f pom.xml -cd c/target -pwd - #/usr/local/graalvm-jdk-21.0.3+7.1/bin/java -agentlib:native-image-agent=config-merge-dir=META-INF/native-image -classpath .:lib/*:server-boot.jar gvm.c.Main -/usr/local/graalvm-jdk-21.0.3+7.1/bin/java -agentlib:native-image-agent=config-merge-dir=META-INF/native-image -jar server-boot.jar \ No newline at end of file +/usr/local/graalvm-jdk-17.0.11+7.1/bin/java -agentlib:native-image-agent=config-merge-dir=native-image/config -cp "c/target/lib/*:c/target/server-boot.jar" gvm.test.c.NativeMain \ No newline at end of file diff --git a/gvm/package.sh b/gvm/package.sh index 66fc94a..61b08c2 100644 --- a/gvm/package.sh +++ b/gvm/package.sh @@ -7,7 +7,7 @@ export PATH=$JAVA_HOME/bin:$PATH # 打印出Java版本信息以验证设置是否成功 java -version #cd /mnt/e/work/engine712-server -mvn clean package -f pom.xml +mvn clean compiler test -Dtest=action.NativeClassActionTest#f1 -DfailIfNoTests=false package -f pom.xml cd c/target diff --git a/gvm/pom.xml b/gvm/pom.xml index c79f30c..2695323 100644 --- a/gvm/pom.xml +++ b/gvm/pom.xml @@ -15,8 +15,8 @@ - 21 - 21 + 1.8 + 1.8 UTF-8 @@ -56,28 +56,24 @@ org.projectlombok lombok - 1.18.30 + 1.18.20 + provided - ch.qos.logback - logback-access - 1.4.14 + org.slf4j + slf4j-api + 1.7.7 ch.qos.logback logback-classic - 1.4.14 + 1.1.3 ch.qos.logback logback-core - 1.4.14 - - - org.slf4j - slf4j-api - 2.0.7 + 1.1.3 @@ -112,7 +108,7 @@ 0.10.2 gvm-test - gvm.b.Main + gvm.c.Main --no-fallback @@ -143,20 +139,20 @@ 128m 1624m - - -Xpkginfo:always - - -Xlint:deprecation - --add-opens=java.base/java.lang=ALL-UNNAMED - --add-opens=java.base/java.util=ALL-UNNAMED - --add-exports=java.base/sun.security.pkcs=ALL-UNNAMED - --add-exports=java.base/sun.reflect.annotation=ALL-UNNAMED - --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED - --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED - --add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED - --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED - --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED - + + + + + + + + + + + + + +