diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/proxy/AsgcProxyFactory.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/proxy/AsgcProxyFactory.java index 030fb384..acda3524 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/proxy/AsgcProxyFactory.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/proxy/AsgcProxyFactory.java @@ -91,10 +91,10 @@ public class AsgcProxyFactory implements ProxyFactory { } private Class compile(ProxyClass proxyClass) throws ClassNotFoundException { - if (SystemUtil.isStartupFromJar() || GlobalConfig.isSaveGeneratorCode()) { - compiler.compileToFile(proxyClass); - return (Class)classLoader.loadProxyClass(proxyClass); - } +// if (SystemUtil.isStartupFromJar() || GlobalConfig.isSaveGeneratorCode()) { +// compiler.compileToFile(proxyClass); +// return (Class)classLoader.loadProxyClass(proxyClass); +// } compiler.compile(proxyClass); return (Class)classLoader.loadProxyClass(proxyClass); } diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/proxy/ProxyCompiler.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/proxy/ProxyCompiler.java index 176a54b4..43942a7b 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/proxy/ProxyCompiler.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/aop/proxy/ProxyCompiler.java @@ -120,6 +120,9 @@ public class ProxyCompiler { } } list.add(GlobalConfig.getGeneratorCodeSavePath() + "BOOT-INF/classes/"); + if (SystemUtil.isStartupFromJar()) { + list.add(SystemUtil.getCurrentJarFilePath()); + } return list.stream().collect(Collectors.joining(File.pathSeparator)); } @@ -138,6 +141,7 @@ public class ProxyCompiler { "Visit https://jfinal.com/doc/4-8 for details \n"); } + System.out.println("=====> classpath:" + getOptions()); DiagnosticCollector collector = new DiagnosticCollector<>(); try (MyJavaFileManager javaFileManager = new MyJavaFileManager(compiler.getStandardFileManager(collector, null, null))) { diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/ClassUtil.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/ClassUtil.java index 040e7d99..948d8f55 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/ClassUtil.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/ClassUtil.java @@ -128,39 +128,50 @@ public class ClassUtil { } log.info("开始进行类扫描,扫描包:{}", packageName); Set> classes = new HashSet<>(); - String packagePath = packageName.replace(".", "/"); Enumeration resources = Thread.currentThread().getContextClassLoader().getResources(""); while (resources.hasMoreElements()) { - URL url = resources.nextElement(); - URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}, Thread.currentThread().getContextClassLoader()); - log.info(url.toString()); - String protocol = url.getProtocol(); - if ("jar".equals(protocol)) { - JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); - JarFile jarFile = jarURLConnection.getJarFile(); - Enumeration entries = jarFile.entries(); - while (entries.hasMoreElements()) { - JarEntry jarEntry = entries.nextElement(); - String name = jarEntry.getName(); - int index = name.indexOf(packagePath); - if (index != -1 && name.endsWith(".class")) { - String replace = name.substring(index, name.length() - 6).replace("/", "."); - Class clazz = urlClassLoader.loadClass(replace); - log.debug("scan class {}", clazz.getName()); - classes.add(clazz); - } - } - } else if ("file".endsWith(protocol)) { - String path = url.getPath(); - String targetPath = path + "/" + packagePath; - addClasses(targetPath, classes, packageName); - } + classes.addAll(scan(packageName, resources.nextElement())); + } + if (SystemUtil.isStartupFromJar()) { + classes.addAll(scan(packageName, new URL("jar:file:" + SystemUtil.getCurrentJarFilePath() + "!/"))); } log.info("扫描完毕,包:{}下一共有:{}个类", packageName, classes.size()); classesCache.set(packageName, classes); return classes; } + public static Set> scan(String packageName, URL url) throws IOException, ClassNotFoundException { + Set> result = new HashSet<>(); + if (null == url) { + return result; + } + String packagePath = packageName.replace(".", "/"); + URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}, Thread.currentThread().getContextClassLoader()); + log.info(url.toString()); + String protocol = url.getProtocol(); + if ("jar".equals(protocol)) { + JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); + JarFile jarFile = jarURLConnection.getJarFile(); + Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + JarEntry jarEntry = entries.nextElement(); + String name = jarEntry.getName(); + int index = name.indexOf(packagePath); + if (index != -1 && name.endsWith(".class")) { + String replace = name.substring(index, name.length() - 6).replace("/", "."); + Class clazz = urlClassLoader.loadClass(replace); + log.debug("scan class {}", clazz.getName()); + result.add(clazz); + } + } + } else if ("file".endsWith(protocol)) { + String path = url.getPath(); + String targetPath = path + "/" + packagePath; + addClasses(targetPath, result, packageName); + } + return result; + } + private static void addClasses(String path, Set> classes, String packageName) throws ClassNotFoundException { File[] files = new File(path).listFiles(new FileFilter() { @Override diff --git a/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompilerTest.java b/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompilerTest.java index 553ff9b2..30775ce1 100644 --- a/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompilerTest.java +++ b/neutrino-core/src/test/java/fun/asgc/neutrino/core/aop/compiler/AsgcCompilerTest.java @@ -88,12 +88,12 @@ public class AsgcCompilerTest { compiler.addClasspath("/Users/yangwen/my/tmp/java"); compiler.addClasspath("/Users/yangwen/my/tmp/java/asgc-package-lab1-1.0-SNAPSHOT.jar"); String code = "package a.b;\n" + - "import fun.asgc.lab.pkg.lab1.Dog1;\n" + + "import fun.asgc.lab.pkg.lab1.Dog;\n" + "import fun.asgc.cptest.Player;\n" + "public class RadioPlayer implements Player {\n" + "\tpublic void play() {\n" + -// "\t\tSystem.out.println(Dog.class);\n" + -// "\t\tSystem.out.println(new Dog(\"大黄\").eat(\"骨头\"));\n" + + "\t\tSystem.out.println(Dog.class);\n" + + "\t\tSystem.out.println(new Dog(\"大黄\").eat(\"骨头\"));\n" + "\t\tSystem.out.println(\"收音机播放\");\n" + "\t}\n" + "}\n"; diff --git a/neutrino-core/src/test/java/fun/asgc/neutrino/core/util/ClassUtilTest.java b/neutrino-core/src/test/java/fun/asgc/neutrino/core/util/ClassUtilTest.java index b8dc4f12..ce0a5b92 100644 --- a/neutrino-core/src/test/java/fun/asgc/neutrino/core/util/ClassUtilTest.java +++ b/neutrino-core/src/test/java/fun/asgc/neutrino/core/util/ClassUtilTest.java @@ -25,6 +25,8 @@ import org.junit.Test; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.net.URL; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -71,4 +73,12 @@ public class ClassUtilTest { } } + @Test + public void scan() throws Exception { + String path = "jar:file:/Users/yangwen/my/tmp/java/neutrino-proxy-server-1.0-SNAPSHOT-jar-with-dependencies.jar!/"; + URL url = new URL(path); + Set> c = ClassUtil.scan("fun.asgc.neutrino.proxy.server", url); + System.out.println(c); + } + } diff --git a/neutrino-proxy-server/pom.xml b/neutrino-proxy-server/pom.xml index aecdcf2d..c03c5659 100644 --- a/neutrino-proxy-server/pom.xml +++ b/neutrino-proxy-server/pom.xml @@ -32,20 +32,50 @@ + + + + + + + + + + + + + + + + + + + + + + + - ${artifactId} - org.springframework.boot - spring-boot-maven-plugin - 2.1.3.RELEASE + maven-assembly-plugin - fun.asgc.neutrino.proxy.server.ProxyServer + + + + fun.asgc.neutrino.proxy.server.ProxyServer + + + + jar-with-dependencies + + make-assembly + package - repackage + single