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 @@
+
@@ -12,12 +13,4 @@
-
-
-
\ 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
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+