From bc53e47b74bdc365392cf279d68a2ac9c8d77542 Mon Sep 17 00:00:00 2001 From: hugh Date: Fri, 21 May 2021 14:20:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4demo=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 + build.gradle | 124 ++++++++++++++++++ encrypt.xml | 13 ++ plugin.xml | 16 +++ .../hg/resource/path/transformer/Demo.java | 26 ++++ .../hg/resource/path/transformer/logo.jpg | Bin 0 -> 19727 bytes 6 files changed, 183 insertions(+) create mode 100644 README.md create mode 100644 build.gradle create mode 100644 encrypt.xml create mode 100644 plugin.xml create mode 100644 src/main/java/com/tptj/demo/hg/resource/path/transformer/Demo.java create mode 100644 src/main/resources/com/tptj/demo/hg/resource/path/transformer/logo.jpg diff --git a/README.md b/README.md new file mode 100644 index 0000000..85b536d --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# demo-hyperlink-provider + +资源文件路径转换demo\ +demo生效后,访问pc默认登录页,中间原来的FRlogo会被替换成插件中的logo \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..3d3e2c4 --- /dev/null +++ b/build.gradle @@ -0,0 +1,124 @@ + +apply plugin: 'java' + +[compileJava,compileTestJava]*.options*.encoding = 'UTF-8' + +ext { + /** + * 项目中依赖的jar的路径 + * 1.如果依赖的jar需要打包到zip中,放置在lib根目录下 + * 2.如果依赖的jar仅仅是编译时需要,防止在lib下子目录下即可 + */ + libPath = "$projectDir/../webroot/WEB-INF/lib" + + /** + * 是否对插件的class进行加密保护,防止反编译 + */ + guard = false + + def pluginInfo = getPluginInfo() + pluginPre = "fine-plugin" + pluginName = pluginInfo.id + pluginVersion = pluginInfo.version + + outputPath = "$projectDir/../webroot/WEB-INF/plugins/plugin-" + pluginName + "-1.0/classes" +} + +group = 'com.fr.plugin' +version = '10.0' +sourceCompatibility = '8' + +sourceSets { + main { + java.outputDir = file(outputPath) + output.resourcesDir = file(outputPath) + } +} + +ant.importBuild("encrypt.xml") +//定义ant变量 +ant.projectDir = projectDir +ant.references["compile.classpath"] = ant.path { + fileset(dir: libPath, includes: '**/*.jar') + fileset(dir: ".",includes:"**/*.jar" ) +} + +classes.dependsOn('clean') + +task copyFiles(type: Copy,dependsOn: 'classes'){ + from outputPath + into "$projectDir/classes" +} + +task preJar(type:Copy,dependsOn: guard ? 'compile_encrypt_javas' : 'compile_plain_javas'){ + from "$projectDir/classes" + into "$projectDir/transform-classes" + include "**/*.*" +} +jar.dependsOn("preJar") + +task makeJar(type: Jar,dependsOn: preJar){ + from fileTree(dir: "$projectDir/transform-classes") + baseName pluginPre + appendix pluginName + version pluginVersion + destinationDir = file("$buildDir/libs") + + doLast(){ + delete file("$projectDir/classes") + delete file("$projectDir/transform-classes") + } +} + +task copyFile(type: Copy,dependsOn: ["makeJar"]){ + from "$buildDir/libs" + from("$projectDir/lib") { + include "*.jar" + } + from "$projectDir/plugin.xml" + into file("$buildDir/temp/plugin") +} + +task zip(type:Zip,dependsOn:["copyFile"]){ + from "$buildDir/temp/plugin" + destinationDir file("$buildDir/install") + baseName pluginPre + appendix pluginName + version pluginVersion +} + +//控制build时包含哪些文件,排除哪些文件 +processResources { +// exclude everything +// 用*.css没效果 +// exclude '**/*.css' +// except this file +// include 'xx.xml' +} + +/*读取plugin.xml中的version*/ +def getPluginInfo(){ + def xmlFile = file("plugin.xml") + if (!xmlFile.exists()) { + return ["id":"none", "version":"1.0.0"] + } + def plugin = new XmlParser().parse(xmlFile) + def version = plugin.version[0].text() + def id = plugin.id[0].text() + return ["id":id,"version":version] +} + +repositories { + mavenLocal() + maven { + url = uri('http://mvn.finedevelop.com/repository/maven-public/') + } +} + +dependencies { + //使用本地jar + implementation fileTree(dir: 'lib', include: ['**/*.jar']) + implementation fileTree(dir: libPath, include: ['**/*.jar']) +} + + diff --git a/encrypt.xml b/encrypt.xml new file mode 100644 index 0000000..1401cd1 --- /dev/null +++ b/encrypt.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..2a6183d --- /dev/null +++ b/plugin.xml @@ -0,0 +1,16 @@ + + com.tptj.demo.hg.resource.path.transformer.v10 + + yes + 1.0 + 10.0 + tptj + 2019-07-18 + + + com.tptj.demo.hg.resource.path.transformer + + + + + \ No newline at end of file diff --git a/src/main/java/com/tptj/demo/hg/resource/path/transformer/Demo.java b/src/main/java/com/tptj/demo/hg/resource/path/transformer/Demo.java new file mode 100644 index 0000000..149a2b9 --- /dev/null +++ b/src/main/java/com/tptj/demo/hg/resource/path/transformer/Demo.java @@ -0,0 +1,26 @@ +package com.tptj.demo.hg.resource.path.transformer; + +import com.fr.intelli.record.Focus; +import com.fr.log.FineLoggerFactory; +import com.fr.record.analyzer.EnableMetrics; +import com.fr.stable.fun.impl.AbstractResourcePathTransformer; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2021-05-21 + **/ +@EnableMetrics +public class Demo extends AbstractResourcePathTransformer { + @Override + @Focus(id = "com.tptj.demo.hg.resource.path.transformer.v10",text = "资源替换demo") + public boolean accept(String source) {//走IOUtils的read方法都会生效 + FineLoggerFactory.getLogger().info("#####:{}",source); + return "/com/fr/web/resources/dist/resources/logo.png".equals(source); + } + + @Override + public String transform(String source) { + return "/com/tptj/demo/hg/resource/path/transformer/logo.jpg"; + } +} diff --git a/src/main/resources/com/tptj/demo/hg/resource/path/transformer/logo.jpg b/src/main/resources/com/tptj/demo/hg/resource/path/transformer/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5dafd3e354b14463bf5341dee66274eda7da7cb8 GIT binary patch literal 19727 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 literal 0 HcmV?d00001