diff --git a/pom.xml b/pom.xml index 0c59ce87..cf41040d 100644 --- a/pom.xml +++ b/pom.xml @@ -99,6 +99,7 @@ + weixin-graal weixin-java-common weixin-java-cp weixin-java-mp @@ -331,6 +332,14 @@ + + + native-image + + false + + + diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml new file mode 100644 index 00000000..07f03ddd --- /dev/null +++ b/weixin-graal/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + com.github.binarywang + wx-java + 3.6.7.B + + + weixin-graal + WxJava - Graal + 微信开发Java内部配合graal以产生native-image配置的辅助工具, 可以通过项目的 native-image Profile 来启用: mvn -P native-image ... + + + + + + org.projectlombok + lombok + compile + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + none + + + + + + diff --git a/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java b/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java new file mode 100644 index 00000000..c09190c3 --- /dev/null +++ b/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java @@ -0,0 +1,167 @@ +package cn.binarywang.wx.graal; + +import lombok.Data; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.ElementFilter; +import javax.tools.FileObject; +import javax.tools.StandardLocation; +import java.io.IOException; +import java.io.Writer; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +// 目前仅仅处理@Data,且必须在lombok自己的processor之前执行,千万注意!!!!! +@SupportedAnnotationTypes("lombok.Data") +@SupportedSourceVersion(SourceVersion.RELEASE_7) +public class GraalProcessor extends AbstractProcessor { + + private static final String REFLECTION_CONFIG_JSON = "reflection-config.json"; + private static final String NATIVE_IMAGE_PROPERTIES = "native-image.properties"; + + private SortedSet classSet = new TreeSet<>(); + private String shortestPackageName = null; + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + for (TypeElement annotatedClass : ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Data.class))) { + + registerClass(annotatedClass.getQualifiedName().toString()); + handleSuperClass(annotatedClass); + } + + //只有最后一轮才可以写文件,否则文件会被重复打开,报错! + if (!roundEnv.processingOver()) return false; + + // 如果没有文件要写,跳过 + if (classSet.isEmpty()) return false; + + writeFiles(); + + //必须返回false,以便让lombok能继续处理。 + return false; + } + + /** + * 设置当前最短的package名称 + * + * @param packageName 包名 + */ + private void setShortestPackageName(String packageName) { + if (shortestPackageName == null) { + shortestPackageName = packageName; + } else if (packageName.length() < shortestPackageName.length()) { + shortestPackageName = packageName; + } + } + + /** + * 更加完整的类名来获取package名称 + * + * @param fullClassName 完整的类名 + * @return package name + */ + private String getPackageName(String fullClassName) { + int last = fullClassName.lastIndexOf('.'); + if (last == -1) return fullClassName; + return fullClassName.substring(0, last); + } + + /** + * 保存文件 + * META-INF/native-image/.../reflection-config.json + * META-INF/native-image/.../native-image.properties + */ + private void writeFiles() { + String basePackage = shortestPackageName; + + String module; + if (basePackage.contains(".")) { + final int i = basePackage.lastIndexOf('.'); + module = basePackage.substring(i + 1); + basePackage = basePackage.substring(0, i); + } else { + module = basePackage; + } + + String path = "META-INF/native-image/" + basePackage + "/" + module + "/"; + String reflectFile = path + REFLECTION_CONFIG_JSON; + String propsFile = path + NATIVE_IMAGE_PROPERTIES; + try { + FileObject fileObject = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", propsFile); + Writer writer = fileObject.openWriter(); + writer.append("Args = -H:ReflectionConfigurationResources=${.}/" + REFLECTION_CONFIG_JSON); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + FileObject fileObject = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", reflectFile); + Writer writer = fileObject.openWriter(); + writer.write("[\n"); + boolean first = true; + for (String name : classSet) { + if (first) { + first = false; + } else { + writer.write(","); + } + writer.write(assetGraalJsonElement(name)); + writer.append('\n'); + } + writer.write("]"); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + private String assetGraalJsonElement(String className) { + return "{\n" + + " \"name\" : \"" + className + "\",\n" + + " \"allDeclaredFields\":true,\n" + + " \"allDeclaredMethods\":true,\n" + + " \"allDeclaredConstructors\":true,\n" + + " \"allPublicMethods\" : true\n" + + "}"; + } + + /** + * 登记一个class + * + * @param className 完整的类名 + */ + private void registerClass(String className) { + classSet.add(className); + setShortestPackageName(getPackageName(className)); + } + + /** + * 获取一个类型的所有的父类,并登记 + * + * @param typeElement 类型元素 + */ + private void handleSuperClass(TypeElement typeElement) { + TypeMirror superclass = typeElement.getSuperclass(); + if (superclass.getKind() == TypeKind.DECLARED) { + TypeElement s = (TypeElement) ((DeclaredType) superclass).asElement(); + String sName = s.toString(); + // ignore java.**/javax.** + if (sName.startsWith("java.") || sName.startsWith("javax.")) return; + registerClass(sName); + handleSuperClass(s); + } + } + +} diff --git a/weixin-graal/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/weixin-graal/src/main/resources/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 00000000..fed7c4d9 --- /dev/null +++ b/weixin-graal/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1 @@ +cn.binarywang.wx.graal.GraalProcessor diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index e67c4ac8..5ddd463e 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -1,7 +1,7 @@ - + 4.0.0 com.github.binarywang @@ -134,4 +134,36 @@ + + + native-image + + false + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + cn.binarywang.wx.graal.GraalProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor + + + + com.github.binarywang + weixin-graal + ${project.version} + + + + + + + + + + diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 0ea2cfb5..01dadb32 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -95,4 +95,36 @@ + + + native-image + + false + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + cn.binarywang.wx.graal.GraalProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor + + + + com.github.binarywang + weixin-graal + ${project.version} + + + + + + + + + + diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 9c555a58..7bbe8e23 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -80,12 +80,12 @@ org.projectlombok lombok - - com.github.jedis-lock - jedis-lock - 1.0.0 - true - + + com.github.jedis-lock + jedis-lock + 1.0.0 + true + @@ -102,4 +102,35 @@ + + + native-image + + false + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + cn.binarywang.wx.graal.GraalProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor + + + + com.github.binarywang + weixin-graal + ${project.version} + + + + + + + + + diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 2cbf9967..a4b1eee7 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -96,4 +96,35 @@ + + + native-image + + false + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + cn.binarywang.wx.graal.GraalProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor + + + + com.github.binarywang + weixin-graal + ${project.version} + + + + + + + + + diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 150cb7b3..9800e53e 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -107,5 +107,35 @@ + + + native-image + + false + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + cn.binarywang.wx.graal.GraalProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor + + + + com.github.binarywang + weixin-graal + ${project.version} + + + + + + + + diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 2b28f5c2..2fd3745f 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -72,4 +72,35 @@ + + + native-image + + false + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + cn.binarywang.wx.graal.GraalProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor + + + + com.github.binarywang + weixin-graal + ${project.version} + + + + + + + + +