Просмотр исходного кода

Merge branch 'master' into release-2.9.6

# Conflicts:
#	README.md
#	class-winter-core/pom.xml
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AllTest.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AlreadyProtectedLibs_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Debug_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/EncryptArgParam_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/ExcludePrefix_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/FinalName_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludeLibs_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludePrefix_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/JvmArgCheck_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/OriginJarOrWar_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Password_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/SupportFile_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Tips_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/War_Test.java
#	class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Xml_Test.java
#	class-winter-core/src/test/resources/class-winter-core-2.9.5.jar
#	class-winter-maven-plugin/pom.xml
#	pom.xml
JustryDeng 1 год назад
Родитель
Сommit
a222539bde
24 измененных файлов с 253 добавлено и 231 удалено
  1. 110 97
      README.md
  2. 2 2
      class-winter-core/pom.xml
  3. 6 3
      class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/executor/EncryptExecutor.java
  4. 11 1
      class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/Constant.java
  5. 2 2
      class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/EncryptClassArgs.java
  6. 62 60
      class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/EncryptUtil.java
  7. 25 33
      class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/JavassistUtil.java
  8. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AllTest.java
  9. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AlreadyProtectedLibs_Test.java
  10. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Debug_Test.java
  11. 5 3
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/EncryptArgParam_Test.java
  12. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/ExcludePrefix_Test.java
  13. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/FinalName_Test.java
  14. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludeLibs_Test.java
  15. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludePrefix_Test.java
  16. 3 3
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/JvmArgCheck_Test.java
  17. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/OriginJarOrWar_Test.java
  18. 3 3
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Password_Test.java
  19. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/SupportFile_Test.java
  20. 3 3
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Tips_Test.java
  21. 5 5
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/War_Test.java
  22. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Xml_Test.java
  23. BIN
      class-winter-core/src/test/resources/class-winter-core-2.9.5.jar
  24. BIN
      class-winter-core/src/test/resources/class-winter-core-2.9.6.jar

+ 110 - 97
README.md

@@ -1,22 +1,21 @@
 
 # 代码混淆之class-winter
 
-
 - [代码混淆之class-winter](#代码混淆之class-winter)
-    - [仓库最新版本](#仓库最新版本)
-    - [<font  face="幼圆" color = "#3399EA" >环境要求</font>](#font--face幼圆-color--3399ea-环境要求font)
-    - [<font  face="幼圆" color = "#3399EA" >功能与特性</font>](#font--face幼圆-color--3399ea-功能与特性font)
-    - [<font  face="幼圆" color = "#3399EA" >加密</font>](#font--face幼圆-color--3399ea-加密font)
-    - [<font  face="幼圆" color = "#3399EA" >加密参数</font>](#font--face幼圆-color--3399ea-加密参数font)
-    - [<font  face="幼圆" color = "#3399EA" >解密(启动)</font>](#font--face幼圆-color--3399ea-解密启动font)
-    - [<font  face="幼圆" color = "#3399EA" >解密参数</font>](#font--face幼圆-color--3399ea-解密参数font)
-    - [<font  face="幼圆" color = "#3399EA" >对class-winter本身进行加密</font>](#font--face幼圆-color--3399ea-对class-winter本身进行加密font)
-    - [<font  face="幼圆" color = "#3399EA" >将已加密的包提供给客户使用</font>](#font--face幼圆-color--3399ea-将已加密的包提供给客户使用font)
-        - [<font  face="幼圆" color = "#86CA5E" >方案</font>](#font--face幼圆-color--86ca5e-方案font)
-        - [<font  face="幼圆" color = "#86CA5E" >示例</font>](#font--face幼圆-color--86ca5e-示例font)
-    - [功能扩展案例](#功能扩展案例)
-    - [<font  face="幼圆" color = "#F53B45">**FAQ**</font>](#font--face幼圆-color--f53b45faqfont)
-    - [QQ群](#qq群)
+  - [仓库最新版本](#仓库最新版本)
+  - [环境要求](#环境要求)
+  - [功能与特性](#功能与特性)
+  - [加密](#加密)
+  - [加密参数](#加密参数)
+  - [解密(启动)](#解密启动)
+  - [解密参数](#解密参数)
+  - [对class-winter本身进行加密](#对class-winter本身进行加密)
+  - [将已加密的包提供给客户使用](#将已加密的包提供给客户使用)
+    - [方案](#方案)
+    - [示例](#示例)
+  - [功能扩展案例](#功能扩展案例)
+  - [**FAQ**](#faq)
+  - [QQ群](#qq群)
 
 ---
 
@@ -26,15 +25,15 @@
     <img alt="maven" src="https://img.shields.io/maven-central/v/com.idea-aedi/class-winter-maven-plugin?style=flat-square">
   </a>
 
-<font face="幼圆"  color = "#F53B45">**郑重声明**</font>
+**郑重声明**
 
 [**class-winter**](https://gitee.com/JustryDeng/class-winter) 是本人在学习完 [**class-final(v1.1.9)**](https://gitee.com/roseboy/classfinal) 后,仿照class-final进行编写的,部分思路与class-final一致
 
-## <font  face="幼圆" color = "#3399EA" >环境要求</font>
+## 环境要求
 
-- 支持jdk8语法环境即可
+- 支持jdk8(8、11、17、21等)语法环境
 
-  > **<font face="幼圆"  color = "#F53B45">本人构建class-winter时,用的jdk版本为:`1.8.0_281`</font>**
+  > **本人构建class-winter时,用的jdk版本为:`1.8.0_281`**
 
   注:tomcat版本不能低于8(部分小版本低的tomcat8可能也不行),否则可能报错
   
@@ -45,18 +44,18 @@
   注:如果有兼容低版本jdk的需求,可以自己下载master分支代码,进行对应修改
   
 
-## <font  face="幼圆" color = "#3399EA" >功能与特性</font>
+## 功能与特性
 
 - 支持war(普通war+可执行war)加密
 - 支持jar(普通jar+可执行jar)加密
 - 支持xml加密(掩耳盗铃版)
 
-## <font  face="幼圆" color = "#3399EA" >加密</font>
+## 加密
 
-- #### <font face="幼圆" ><font face="幼圆"  color = "#86CA5E">**方式一**</font>:通过maven插件自动加密</font>
+- #### **方式一**:通过maven插件自动加密
   ```xml
   <!--
-      class-winter插件``
+      class-winter插件
       注:自Maven3.0.3起, 绑定到同一phase的Maven插件将按照pom.xml中声明的顺序执行
       注:此插件最好放置在同一phase的最后执行。
       注:此插件不具备打包功能,需要在此插件前有打包插件进行项目打包,否则加密不会生效。
@@ -64,7 +63,7 @@
   <plugin>
       <groupId>com.idea-aedi</groupId>
       <artifactId>class-winter-maven-plugin</artifactId>
-      <version>2.9.5</version>
+      <version>2.9.6</version>
       <!-- 相关配置 -->
       <configuration>
           <!-- <finalName></finalName>-->
@@ -95,20 +94,20 @@
   ```
   注:不必担心信息泄漏问题,使用此方式生成混淆的jar包时,会擦除pom.xml中关于class-winter-plugin的信息。
   
-- #### <font face="幼圆" ><font face="幼圆"  color = "#86CA5E">**方式二**</font>:通过 [**class-winter-core.jar**](https://gitee.com/JustryDeng/class-winter/raw/master/class-winter-core/src/test/resources/class-winter-core-2.9.5.jar) 主动加密</font>
+- #### **方式二**:通过[**class-winter-core.jar**](https://gitee.com/JustryDeng/class-winter/raw/master/class-winter-core/src/test/resources/class-winter-core-2.9.6.jar) 主动加密
 
   ```bash
-  java -jar class-winter-core-2.9.5.jar originJarOrWar=${要加密的项目.jar或.war包} includePrefix=${加密范围} [k3=v3 k4=v4 ...]
+  java -jar class-winter-core-2.9.6.jar originJarOrWar=${要加密的项目.jar或.war包} includePrefix=${加密范围} [k3=v3 k4=v4 ...]
   # 对于复杂的参数值,可以使用引号引起来
   # linux
-  java -jar class-winter-core-2.9.5.jar k1='v1' k2='v2'
+  java -jar class-winter-core-2.9.6.jar k1='v1' k2='v2'
   # windows
-  java -jar class-winter-core-2.9.5.jar k1="v1" k2="v2"
+  java -jar class-winter-core-2.9.6.jar k1="v1" k2="v2"
   ```
 
-## <font  face="幼圆" color = "#3399EA" >加密参数</font>
+## 加密参数
 
-> <font  face="幼圆" color = "#F53B45">**提示:**</font>慎用`cca(尤其)`、`cma`、`cfa`参数,如果要用,请做好充分测试。
+> **提示:** 慎用`cca(尤其)`、`cma`、`cfa`参数,如果要用,请做好充分测试。
 >
 > 原因说明:部分框架在获取某些元数据时,并不全都从已被premain处理后的类中读取,而是直接去对应位置读取资源文件本身(如:spring的`SimpleMetadataReader implements MetadataReader`直接去读取.class文件本身,以知道是否需要将类注册进容器等),因为class-winter会对该位置的资源进行加密(如:使用cca、cma、cfa时会擦除类、方法、字段上的注解信息),因此此时如果直接去.class文件本身获取元信息的话,可能会丢失部分信息(如:被class-winter擦除了的类的注解信息就读取不到)
 >
@@ -132,14 +131,13 @@
     <tr align="center">
     <td>includePrefix</td>
     <td>是</td>
-    <td>通过前缀匹配的形式定位要加密的class,支持正则匹配
-    <br/>
-注:多个通过逗号分割。</td>
+    <td>通过前缀匹配的形式定位要加密的class
+      <br/> 注:也支持正则匹配(使用【.*】匹配所有而不用【*】)
+      <br/> 注:多个通过逗号分割。
+    </td>
     <td>includePrefix=com
-    <br/>
-includePrefix=com,org
- <br/>
-includePrefix=com.*.dao,org
+    <br/>includePrefix=com,org
+    <br/>includePrefix=com.*.dao,org
 </td>
   </tr>
  <tr align="center">
@@ -163,31 +161,30 @@ includePrefix=com.*.dao,org
 <tr align="center">
     <td>caPrefix(依托于cca、cma、cfa开关)</td>
     <td>否</td>
-    <td>作为includePrefi``x的附加设置,依托于cca、cma、cfa开关,清空类、方法、字段上的指定注解(写法同url后面设置参数)
-      <br/>
-注:多个通过|分割,注解请写完全路径例如:com.xx.anno.MyAnnotation  
+    <td>作为includePrefix的附加设置,依托于cca、cma、cfa开关,清空类、方法、字段上的指定注解(写法同url后面设置参数)
+      <br/> 注:多个通过|分割,注解请写完全路径例如:com.xx.anno.MyAnnotation  
     </td>
     <td>includePrefix=com?cca=true&cma=true&cfa=true&caPrefix=com.xx.anno.MyAnnotation|com.bb.anno.MyAnnotation</td>
   </tr>
     <tr align="center">
     <td>excludePrefix</td>
     <td>否</td>
-    <td>通过前缀匹配的形式排除class,不对其加密,支持正则匹配
-    <br/>
-注:多个通过逗号分割。
-<br/>
-注:excludePrefix优先级高于includePrefix。</td>
+        <td>通过前缀匹配的形式排除class,不对其加密
+             <br/> 注:也支持正则匹配(使用【.*】匹配所有而不用【*】)
+             <br/> 注:多个通过逗号分割。
+             <br/> 注:excludePrefix优先级高于includePrefix。
+        </td>
     <td>excludePrefix=com.example.service,com.example.util.*.class</td>
   </tr>
       </tr>
     <tr align="center">
     <td>includeXmlPrefix</td>
     <td>否</td>
-    <td>通过打出来的包中条目的entryName前缀匹配的形式定位要加密的xml,支持正则匹配
-    <br/>
-注:多个通过逗号分割。    
-    <br/>
-注:如果您打出来的加密包是准备作为一个lib包提供给第三方使用的,那么请不要使用此参数,因为解密时是不会解密项目所依赖的lib包中的xml的。</td>
+    <td>通过打出来的包中条目的entryName前缀匹配的形式定位要加密的xml
+        <br/> 注:也支持正则匹配(使用【.*】匹配所有而不用【*】)
+        <br/> 注:多个通过逗号分割。    
+        <br/> 注:如果您打出来的加密包是准备作为一个lib包提供给第三方使用的,那么请不要使用此参数,因为解密时是不会解密项目所依赖的lib包中的xml的。
+    </td>
     <td>includeXmlPrefix=BOOT-INF/classes/
     <br/>
 includeXmlPrefix=BOOT-INF/classes/com/demo/mapper/,BOOT-INF/classes/com/*/dao/</td>
@@ -196,7 +193,8 @@ includeXmlPrefix=BOOT-INF/classes/com/demo/mapper/,BOOT-INF/classes/com/*/dao/</
     <tr align="center">
     <td>excludeXmlPrefix</td>
     <td>否</td>
-    <td>通过打出来的包中条目的entryName前缀匹配的形式排除xml,不对其加密,支持正则匹配
+    <td>通过打出来的包中条目的entryName前缀匹配的形式排除xml,不对其加密
+       <br/> 注:也支持正则匹配(使用【.*】匹配所有而不用【*】)
     <br/>
 注:多个通过逗号分割。</td>
     <td>excludeXmlPrefix=BOOT-INF/classes/com/demo/mapper/
@@ -234,11 +232,11 @@ excludeXmlPrefix=BOOT-INF/classes/com/demo/mapper/,BOOT-INF/classes/com/demo/*/U
     <tr align="center">
     <td>includeLibs</td>
     <td>否</td>
-    <td>指定将lib包也纳入加密范围内,支持正则匹配
-    <br/>
-注:多个通过逗号分割。
-<br/>
-注:lib中的class是否会被加密,还得由includePrefix和excludePrefix决定。</td>
+    <td>指定将lib包也纳入加密范围内
+      <br/> 注:也支持正则匹配(使用【.*】匹配所有而不用【*】)
+      <br/> 注:多个通过逗号分割。
+      <br/> 注:lib中的class是否会被加密,还得由includePrefix和excludePrefix决定。
+    </td>
     <td>includeLibs=a.jar,b.jar,c-.*.jar</td>
   </tr>
     <tr align="center">
@@ -259,7 +257,7 @@ excludeXmlPrefix=BOOT-INF/classes/com/demo/mapper/,BOOT-INF/classes/com/demo/*/U
     <br/>
 注:多个通过逗号分割。
 <br/>
-注:主要用于处理第三方提供的由class-winter加密了的依赖包的场景。
+注主要用于处理第三方提供的由class-winter加密了的依赖包的场景。
 <br/>
 注:若lib需要密码,那么需要在指定lib的同时通过冒号接上密码。
 <br/>
@@ -277,7 +275,7 @@ alreadyProtectedLibs=a.jar:pwd1,b-1.0.0.jar:pwd2</td>
     <br/>
 注:当为目录时,该目录(含子孙目录)下的所有jar都会被采集作为辅助文件。
 <br/>
-注:主要用于解决因ClassNotFound导致的加密失败问题。</td>
+注主要用于解决因ClassNotFound导致的加密失败问题。</td>
     <td>supportFile=/abc.jar
     <br/>
 supportFile=/libs</td>
@@ -314,22 +312,17 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
 
 
 
-
-
-
-
-
-## <font  face="幼圆" color = "#3399EA" >解密(启动)</font>
+## 解密(启动)
 
 > `class-winter`支持`JVM`参数校验,通过在JVM参数中加入`-XX:+DisableAttachMechanism`来防止其他工具连接到你的Java程序。这样可以阻止运行至dump class。
 > 
 > 但是有些高级开发者可能会想要使用`sa-jdi` 的 `HSDB` 来 `dump` 字节码。从`2.8.8`版本开始,支持在启动Java解密时禁用了gHotSpotVMStructs函数,避免使用sa-jdi HSDB 来dump class,提高代码安全性。
-- #### <font  face="幼圆" color = "#86CA5E" >jar解密(启动)</font>
+- #### jar解密(启动)
   ```bash
   # 假设your-project-encrypted.jar是由class-winter加密后的包,那么你可以这么启动
   java -javaagent:/your-project-encrypted.jar -jar /your-project-encrypted.jar
-  # 也可以用class-winter-core-2.9.5.jar
-  # java -javaagent:/class-winter-core-2.9.5.jar -jar /your-project-encrypted.jar
+  # 也可以用class-winter-core-2.9.6.jar
+  # java -javaagent:/class-winter-core-2.9.6.jar -jar /your-project-encrypted.jar
   # 或者指定参数
   # java -javaagent:/your-project-encrypted.jar=debug=true,password=pwd12345 -jar /your-project-encrypted.jar
   # 参数可以引起来(linux)
@@ -338,16 +331,16 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
   # java -javaagent:/your-project-encrypted.jar="debug=true,password=pwd12345" -jar /your-project-encrypted.jar
   ```
 
-- #### <font  face="幼圆" color = "#86CA5E" >war解密(启动)</font>
+- #### war解密(启动)
   > **以Tomcat9为例**
   - linux方式一
 
     编辑tomcat/bin/catalina.sh文件,在最上面加上
 
     ```bash
-    # 如果你有参数, 那么 -javaagent:/class-winter-core-2.9.5.jar=k1=v1,k2=v2
+    # 如果你有参数, 那么 -javaagent:/class-winter-core-2.9.6.jar=k1=v1,k2=v2
     # tomcat启动往往需要通过decryptProjectPathPrefix指定要解密的路径
-    CATALINA_OPTS="$CATALINA_OPTS -javaagent:/class-winter-core-2.9.5.jar=debug=true,decryptProjectPathPrefix=/usr/local/xxx/";
+    CATALINA_OPTS="$CATALINA_OPTS -javaagent:/class-winter-core-2.9.6.jar=debug=true,decryptProjectPathPrefix=/usr/local/xxx/";
     export CATALINA_OPTS;
     ```
   
@@ -356,9 +349,9 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
     在tomcat/bin目录下创建setenv.sh文件,并写上
   
     ```bash
-    # 如果你有参数, 那么 -javaagent:/class-winter-core-2.9.5.jar=k1=v1,k2=v2
+    # 如果你有参数, 那么 -javaagent:/class-winter-core-2.9.6.jar=k1=v1,k2=v2
     # tomcat启动往往需要通过decryptProjectPathPrefix指定要解密的路径
-    JAVA_OPTS="$JAVA_OPTS -javaagent:/class-winter-core-2.9.5.jar=debug=true,decryptProjectPathPrefix=/usr/local/xxx/";
+    JAVA_OPTS="$JAVA_OPTS -javaagent:/class-winter-core-2.9.6.jar=debug=true,decryptProjectPathPrefix=/usr/local/xxx/";
     export JAVA_OPTS;
     ```
 
@@ -367,9 +360,9 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
     编辑tomcat/bin/catalina.bat文件,在@echo off后加上catalina参数
   
     ```bash
-    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.9.5.jar=k1=v1,k2=v2
+    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.9.6.jar=k1=v1,k2=v2
     rem tomcat启动往往需要通过decryptProjectPathPrefix指定要解密的路径
-    set CATALINA_OPTS="-javaagent:D:/class-winter-core-2.9.5.jar=decryptProjectPathPrefix=/D:/tmp/"
+    set CATALINA_OPTS="-javaagent:D:/class-winter-core-2.9.6.jar=decryptProjectPathPrefix=/D:/tmp/"
     ```
   
   - windows方式二
@@ -377,12 +370,12 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
     在tomcat/bin目录下创建setenv.bat文件,并写上
   
     ```bash
-    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.9.5.jar=k1=v1,k2=v2
+    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.9.6.jar=k1=v1,k2=v2
     rem tomcat启动往往需要通过decryptProjectPathPrefix指定要解密的路径
-    set JAVA_OPTS="-javaagent:D:/class-winter-core-2.9.5.jar=decryptProjectPathPrefix=/D:/tmp/"
+    set JAVA_OPTS="-javaagent:D:/class-winter-core-2.9.6.jar=decryptProjectPathPrefix=/D:/tmp/"
     ```
   
-- #### <font  face="幼圆" color = "#86CA5E" >IDE解密(启动)</font>
+- #### IDE解密(启动)
 
   > 设置`-javaagent`参数指定class-winter-core或者任一加密包。有必要的话,再搭配`skipProjectPathPrefix`或者`decryptProjectPathPrefix`参数启动即可
 
@@ -390,7 +383,7 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
 
 
 
-## <font  face="幼圆" color = "#3399EA" >解密参数</font>
+## 解密参数
 
 <table>
   <tr align="center">
@@ -445,18 +438,18 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
   </tr>
 </table>
 
-## <font  face="幼圆" color = "#3399EA" >对class-winter本身进行加密</font>
+## 对class-winter本身进行加密
 
 > 感谢小伙伴[Mango](https://gitee.com/mango_ye)对class-winter的优质反馈
 
 - 背景说明:我们利用class-winter混淆项目时,项目是被混淆了,但是class-winter本身还是明文的,这就留下了一些安全隐患(即:那些不指定密码的混淆,可能会被反向破解)
 - 增强支持:我们可以对class-winter本身进行加密,你可以切换至`enhance-*`分支,在首页下载被混淆的class-winter进行测试,或者clone代码,install后进行测试
-- <font face="幼圆"  color = "#F53B45">**声明**</font>:因为在`enhance-*`分支里对class-winter本身进行加密时用到了收费工具allatori(实际上有供学习使用的破解版之类的),所以`enhance-*`分支的代码,本人并未发布至maven官方仓库
+- **声明**:因为在`enhance-*`分支里对class-winter本身进行加密时用到了收费工具allatori(实际上有供学习使用的破解版之类的),所以`enhance-*`分支的代码,本人并未发布至maven官方仓库
 
 
-## <font  face="幼圆" color = "#3399EA" >将已加密的包提供给客户使用</font>
+## 将已加密的包提供给客户使用
 
-### <font  face="幼圆" color = "#86CA5E" >方案</font>
+### 方案
 
 - 方案一(适用于encrypted-A依赖于encrypted-B.jar,启动encrypted-A的情况)
 
@@ -468,7 +461,7 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
 
   利用`-Dloader.path`或其它方案,将encrypted-B.jar外置,并通过`decryptProjectPathPrefix`或`skipProjectPathPrefix`来定位encrypted-B.jar
 
-### <font  face="幼圆" color = "#86CA5E" >示例</font>
+### 示例
 
 > 提示:这里以可执行的jar进行的示例,其余的外置方式也是可以的(如:tomcat部署war包解压后,lib包就相当于是外置的)
 
@@ -607,11 +600,11 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
 
 
 
-## <font  face="幼圆" color = "#F53B45">**FAQ**</font>
+## **FAQ**
 
 > class-winter初始能力设计理念是,只做通用能力支持,如果没法做到通用,那就干脆不做,需要的话使用者自行扩展
 
-- <font  face="幼圆" color = "#F53B45">**1. 加密失败并伴有` Ignore clear-method-body for className [xxx], Cannot find 'yyy'`提示**</font>
+- **1. 加密失败并伴有` Ignore clear-method-body for className [xxx], Cannot find 'yyy'`提示**
 
   - 原因:类`xxx`中使用到了类`yyy`,但是被加密包中不存在`yyy`类
 
@@ -621,25 +614,25 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
 
     注:使用supportFile时,尽量控制指定范围,如果指定的范围太大(如无脑指定整个依赖仓库),引入的相关包太多,可能导致一些意料外的加密问题。如:[issues I9VTG9](https://gitee.com/JustryDeng/class-winter/issues/I9VTG9)
 
-- <font  face="幼圆" color = "#F53B45">**2. 是否支持yml等配置文件加密?**</font>
+- **2. 是否支持yml等配置文件加密?**
 
-  <font  face="幼圆" color = "#3CAA3C">**不支持。**</font>
+  **不支持。**
 
   不同的框架加载配置文件的方式不一样,没法写一个通用的加密逻辑,需要的话自行根据所用技术框架自行实现
 
-- <font  face="幼圆" color = "#F53B45">**3. 是否支持对lib包里的xml加密?**</font>
+- **3. 是否支持对lib包里的xml加密?**
 
-  <font  face="幼圆" color = "#3CAA3C">**不支持。**</font>
+  **不支持。**
 
   首先实现起来相对麻烦,其次即便是(通用)加密也是伪加密。除非自己根据框架进行扩展进行定制加密
 
-- <font  face="幼圆" color = "#F53B45">**4. 部分版本spring-boot为啥加密后,启动时读取配置文件内容失败?**</font>
+- **4. 部分版本spring-boot为啥加密后,启动时读取配置文件内容失败?**
 
-  <font  face="幼圆" color = "#3CAA3C">**配置文件使用.yaml或.properties无此问题;部分版本的spring-boot使用.yml配置文件可能出现部分配置读取失败。**</font>
+  **配置文件使用.yaml或.properties无此问题;部分版本的spring-boot使用.yml配置文件可能出现部分配置读取失败。**
 
-- <font  face="幼圆" color = "#F53B45">**5. 启动时明明按要求指定了JVM参数,为啥还是提示Miss jvm arg?**</font>
+- **5. 启动时明明按要求指定了JVM参数,为啥还是提示Miss jvm arg?**
 
-  <font  face="幼圆" color = "#3CAA3C">**JVM参数位置不对,要放在-jar xxx.jar之前**</font>
+  **JVM参数位置不对,要放在-jar xxx.jar之前**
 
   ```bash
   # 错误案例
@@ -648,17 +641,37 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
   java -javaagent:cc-encrypted.jar -XX:+DisableAttachMechanism -jar cc-encrypted.jar 
   ```
 
-- <font  face="幼圆" color = "#F53B45">**6. class-winter是否支持对类名、字段名、方法名等进行混淆?**</font>
+- **6. class-winter是否支持对类名、字段名、方法名等进行混淆?**
 
-  <font  face="幼圆" color = "#3CAA3C">**不支持。**</font>
+  **不支持。**
 
   需要的话,可结合其它混淆工具(如:allatori等)一起加密,可参考enhance分支
 
-- <font  face="幼圆" color = "#F53B45">**7. includeLibs指定了要加密的lib包,为啥没生效?**</font>
+- **7. includeLibs指定了要加密的lib包,为啥没生效?**
+
+  - **如果配置时使用的前缀匹配:** 首先检查指定的前缀是否包含住了指定了lib名,然后检查includePrefix匹配范围是否包含lib中的class
 
-  <font  face="幼圆" color = "#3CAA3C">**首先检查是否正确配置了includeLibs,然后检查includePrefix匹配范围是否包含lib中的class**</font>
+  - **如果配置时使用的模糊匹配:** 首先检查正则语法是否配置正确(见:FAQ-8),然后检查includePrefix匹配范围是否包含lib中的class
 
+- **8. 模糊匹配,正则未生效?**
 
+  **如果用正则的话,使用【`.*`】匹配所有而不用【`*`】**
+
+  你可以这么验证自己的正则是否配置对
+  ```java
+  System.err.println(java.util.regex.Pattern.compile("aab.*bcc").matcher("aabXYZbcc").find()); // 输出true则说明正则写法无误
+  ```
+
+- **9. decryptProjectPathPrefix值如何指定?**
+
+  > 请确保先看过了上面【解密参数】里对此参数的说明及示例
+
+  decryptProjectPathPrefix指定的值,将以前缀匹配的形式匹配要解密的文件。
+  
+  - 如果你是war包,那么你可以指定war包解压后对应的war目录
+  - 如果你是jar包(all-in-one),那么无需指定此参数
+  - 如果你是jar包(lib外置),那么直接指定对应需要解密的lib文件即可
+  - 如果你没有任何头绪,那么你可以先不指定decryptProjectPathPrefix,直接debug启动项目,当因解密失败启动报错时,会debug输出形如**Exist projectPath -> xxx**的信息,该`xxx`即为当前解密失败的文件路径,你可以根据这个路径去反推你的decryptProjectPathPrefix值,然后配置该decryptProjectPathPrefix值再启动即可
 
 ## QQ群
 

+ 2 - 2
class-winter-core/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <groupId>com.idea-aedi</groupId>
         <artifactId>class-winter</artifactId>
-        <version>2.9.5</version>
+        <version>2.9.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -16,7 +16,7 @@
         <dependency>
             <groupId>org.javassist</groupId>
             <artifactId>javassist</artifactId>
-            <version>3.27.0-GA</version>
+            <version>3.30.2-GA</version>
         </dependency>
 
         <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->

+ 6 - 3
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/executor/EncryptExecutor.java

@@ -414,8 +414,8 @@ public class EncryptExecutor {
     /**
      * 清除META-INF/maven下pom.xml中关于class-winter-plugin的相关信息
      *
-     * <p>
-     *
+     * <pre>
+     * {@code
      * <?xml version="1.0" encoding="UTF-8"?>
      * <project ...>
      *     ......
@@ -432,6 +432,8 @@ public class EncryptExecutor {
      *     </build>
      *
      * </project>
+     * }
+     * </pre>
      */
     private void clearWinterPluginInfo() {
         // 只有调用者是插件时,才去清除pom.xml中的class_winter-plugin插件信息
@@ -971,7 +973,8 @@ public class EncryptExecutor {
                                         StrUtil.isTrueDefault(params.get(Constant.CLEAN_CLASS_ANNOTATION_PARAM_NAME), false),
                                         StrUtil.isTrueDefault(params.get(Constant.CLEAN_METHOD_ANNOTATION_PARAM_NAME), false),
                                         StrUtil.isTrueDefault(params.get(Constant.CLEAN_FIELD_ANNOTATION_PARAM_NAME), false),
-                                        params.get(Constant.TO_CLEAN_FIELD_ANNOTATION_PREFIX)
+                                        params.get(Constant.TO_CLEAN_ANNOTATION_PREFIX),
+                                        StrUtil.isTrueDefault(params.get(Constant.KEEP_ORIGIN_ARGS_NAME), true)
                                 );
                             }
                         }

+ 11 - 1
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/Constant.java

@@ -260,8 +260,18 @@ public interface Constant {
      * 参数名:加密的类需要清除的注解全类名前缀(也可以精确匹配),不指定则为默认规则全部注解清除. 分隔符为|符号,例如:com.kk.verify|com.xx.sun
      * <p>
      * {@link EncryptClassArgs#getToCleanAnnotationPrefix()}
+     * <p>
+     * 对类上、字段上、方法上的注解清除都有效
+     */
+    String TO_CLEAN_ANNOTATION_PREFIX = "caPrefix";
+    
+    /**
+     * 参数名:是否保留原始的方法参数名. 值应为boolean类型
+     * <p>
+     * 为false的话,则加密后方法的原始参数名信息将被擦除(注:不保证一定成功),
+     * 反编译后查看到的将是形如var0, var1...之类的参数名(注:不同反编译工具的默认参数名可能不一样)
      */
-    String TO_CLEAN_FIELD_ANNOTATION_PREFIX = "caPrefix";
+    String KEEP_ORIGIN_ARGS_NAME = "keepArgName";
     
     /*
      * 部分projectpath识别出来会多一个nested:/前缀

+ 2 - 2
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/EncryptClassArgs.java

@@ -47,7 +47,7 @@ public class EncryptClassArgs {
      */
     public static EncryptClassArgs create(File encryptClassFile, boolean cleanAnnotationOverClazz,
                                           boolean cleanAnnotationOverMethod, boolean cleanAnnotationOverField,
-            String toCleanAnnotationPrefix) {
+                                          String toCleanAnnotationPrefix, boolean keepOriginArgsName) {
         Objects.requireNonNull(encryptClassFile, "encryptClassFile cannot be null.");
         EncryptClassArgs encryptClassArgs = new EncryptClassArgs();
         encryptClassArgs.setEncryptClassFile(encryptClassFile);
@@ -55,7 +55,7 @@ public class EncryptClassArgs {
         encryptClassArgs.setCleanAnnotationOverMethod(cleanAnnotationOverMethod);
         encryptClassArgs.setCleanAnnotationOverField(cleanAnnotationOverField);
         encryptClassArgs.setToCleanAnnotationPrefix(toCleanAnnotationPrefix);
-
+        encryptClassArgs.setKeepOriginArgsName(keepOriginArgsName);
         return encryptClassArgs;
     }
     

+ 62 - 60
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/EncryptUtil.java

@@ -29,23 +29,26 @@ import java.util.Random;
  */
 public final class EncryptUtil {
     
-    /** 盐 */
+    /**
+     * 盐
+     */
     private static final char[] SALT = {'c', 'h', 'i', '@', 'm', 'i', 'a', 'n', '#', 'y', 'a', 'o', '%', 'f', 'a', 'n', 'g', '^', 'y', 'a', 'n'};
     
-    /** AES 算法/模式/补码方式 */
-    private static final  String AES_MODE = "AES/ECB/PKCS5Padding";
+    /**
+     * AES 算法/模式/补码方式
+     */
+    private static final String AES_MODE = "AES/ECB/PKCS5Padding";
     
     /**
      * 加密
      * <p>
-     *     与{@link EncryptUtil#decrypt(byte[], char[])}成对使用
+     * 与{@link EncryptUtil#decrypt(byte[], char[])}成对使用
      * </p>
      *
-     * @param source
-     *            要加密的内容
-     * @param password
-     *            用户密钥
-     * @return  加密后的内容
+     * @param source 要加密的内容
+     * @param password 用户密钥
+     *
+     * @return 加密后的内容
      */
     public static byte[] encrypt(byte[] source, char[] password) {
         try {
@@ -59,14 +62,13 @@ public final class EncryptUtil {
     /**
      * 解密
      * <p>
-     *     与{@link EncryptUtil#encrypt(byte[], char[])}成对使用
+     * 与{@link EncryptUtil#encrypt(byte[], char[])}成对使用
      * </p>
      *
-     * @param source
-     *            要解密的内容
-     * @param password
-     *            用户密钥
-     * @return  解密后的内容
+     * @param source 要解密的内容
+     * @param password 用户密钥
+     *
+     * @return 解密后的内容
      */
     public static byte[] decrypt(byte[] source, char[] password) {
         try {
@@ -77,17 +79,16 @@ public final class EncryptUtil {
         }
     }
     
-    
     /**
      * 加密
      * <p>
-     *     与{@link EncryptUtil#decrypt(String, char[])}成对使用
+     * 与{@link EncryptUtil#decrypt(String, char[])}成对使用
      * </p>
-     * @param source
-     *            要加密的内容
-     * @param password
-     *            用户密钥
-     * @return  加密后的内容
+     *
+     * @param source 要加密的内容
+     * @param password 用户密钥
+     *
+     * @return 加密后的内容
      */
     public static String encrypt(String source, char[] password) {
         Objects.requireNonNull(source, "source cannot be null.");
@@ -97,13 +98,13 @@ public final class EncryptUtil {
     /**
      * 解密
      * <p>
-     *     与{@link EncryptUtil#encrypt(String, char[])}成对使用
+     * 与{@link EncryptUtil#encrypt(String, char[])}成对使用
      * </p>
-     * @param source
-     *            要解密的内容
-     * @param password
-     *            用户密钥
-     * @return  解密后的内容
+     *
+     * @param source 要解密的内容
+     * @param password 用户密钥
+     *
+     * @return 解密后的内容
      */
     public static String decrypt(String source, char[] password) {
         Objects.requireNonNull(source, "source cannot be null.");
@@ -113,9 +114,9 @@ public final class EncryptUtil {
     /**
      * 生成指定长度的随机字符串
      *
-     * @param length
-     *            长度
-     * @return  字符数组
+     * @param length 长度
+     *
+     * @return 字符数组
      */
     public static char[] generateCharArr(int length) {
         char[] result = new char[length];
@@ -144,18 +145,17 @@ public final class EncryptUtil {
     /**
      * 进行MD5加密
      * <p>
-     *     摘录自 <a href="https://www.jianshu.com/p/b419163272c1" />
+     * 摘录自 <a href="https://www.jianshu.com/p/b419163272c1" />
      * </p>
-     *  注:MD5加密得到的是长度固定的为126bit的二进制串(一堆0和1,一共128),为了更友好的表示结果,
-     *     一般都将128位的二进制串转换为32个16进制位或16个16进制位。(16位的结果是取32位的结果值的中间部分,即32位中第8~24位的片段)
+     * 注:MD5加密得到的是长度固定的为126bit的二进制串(一堆0和1,一共128),为了更友好的表示结果,
+     * 一般都将128位的二进制串转换为32个16进制位或16个16进制位。(16位的结果是取32位的结果值的中间部分,即32位中第8~24位的片段)
+     *
+     * @param source 要加密的内容
+     * @param abbreviation true-返回16位结果;false-返回32位结果
+     * @param upperCase true-结果大写;false-结果小写
      *
-     * @param source
-     *            要加密的内容
-     * @param abbreviation
-     *            true-返回16位结果;false-返回32位结果
-     * @param upperCase
-     *            true-结果大写;false-结果小写
      * @return MD5加密结果
+     *
      * @throws NoSuchAlgorithmException 无此算法时抛出
      */
     @SuppressWarnings("SameParameterValue")
@@ -194,11 +194,10 @@ public final class EncryptUtil {
     /**
      * AES加密
      *
-     * @param source
-     *            要加密的内容
-     * @param key
-     *            密钥
-     * @return  加密后的内容
+     * @param source 要加密的内容
+     * @param key 密钥
+     *
+     * @return 加密后的内容
      */
     private static byte[] encryptByAes(byte[] source, char[] key) {
         try {
@@ -207,7 +206,8 @@ public final class EncryptUtil {
             Cipher cipher = Cipher.getInstance(AES_MODE);
             cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
             return cipher.doFinal(source);
-        } catch (NoSuchAlgorithmException|NoSuchPaddingException|InvalidKeyException|IllegalBlockSizeException|BadPaddingException e) {
+        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException |
+                 BadPaddingException e) {
             throw new ClassWinterException(e);
         }
     }
@@ -215,11 +215,10 @@ public final class EncryptUtil {
     /**
      * AES解密
      *
-     * @param source
-     *            要解密的内容
-     * @param key
-     *            密钥
-     * @return  解密后的内容
+     * @param source 要解密的内容
+     * @param key 密钥
+     *
+     * @return 解密后的内容
      */
     private static byte[] decryptByAes(byte[] source, char[] key) {
         try {
@@ -228,7 +227,8 @@ public final class EncryptUtil {
             Cipher cipher = Cipher.getInstance(AES_MODE);
             cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
             return cipher.doFinal(source);
-        } catch (NoSuchAlgorithmException|NoSuchPaddingException|InvalidKeyException|IllegalBlockSizeException|BadPaddingException e) {
+        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException |
+                 BadPaddingException e) {
             throw new ClassWinterException(e);
         }
     }
@@ -237,14 +237,16 @@ public final class EncryptUtil {
      * 测试
      */
     public static void main(String[] args) {
-//        // => 测试一
-//        String originStr = "嘿~boy~";
-//        byte[] encryptedContent = encrypt(originStr.getBytes(StandardCharsets.UTF_8), "好想吃烧烤JustryDeng123...".toCharArray());
-//        String plaintext = new String(decrypt(encryptedContent, "好想吃烧烤JustryDeng123...".toCharArray()), StandardCharsets.UTF_8);
-//        System.err.println("原文:" + originStr);
-//        System.err.println("加密后:" + encryptedContent);
-//        ///System.err.println("加密后:" + new String(Base64.getEncoder().encode(encryptedContent)));
-//        System.err.println("解密后:" + plaintext);
+        //        // => 测试一
+        //        String originStr = "嘿~boy~";
+        //        byte[] encryptedContent = encrypt(originStr.getBytes(StandardCharsets.UTF_8), "好想吃烧烤JustryDeng123..
+        //        .".toCharArray());
+        //        String plaintext = new String(decrypt(encryptedContent, "好想吃烧烤JustryDeng123...".toCharArray()),
+        //        StandardCharsets.UTF_8);
+        //        System.err.println("原文:" + originStr);
+        //        System.err.println("加密后:" + encryptedContent);
+        //        ///System.err.println("加密后:" + new String(Base64.getEncoder().encode(encryptedContent)));
+        //        System.err.println("解密后:" + plaintext);
         
         // => 测试二
         String originStr = "嘿~boy~";

+ 25 - 33
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/JavassistUtil.java

@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
  * @since 2021/4/25 20:54:30
  */
 public final class JavassistUtil {
-
+    
     /**
      * 清空类中的方法体,并简单处理一下main,使提示密码无效
      *
@@ -62,7 +62,7 @@ public final class JavassistUtil {
             boolean cleanOverMethod = encryptClassArgs.isCleanAnnotationOverMethod();
             boolean cleanOverField = encryptClassArgs.isCleanAnnotationOverField();
             String toCleanAnnotationPrefix = encryptClassArgs.getToCleanAnnotationPrefix();
-
+            
             if (cleanOverCLass || cleanOverMethod || cleanOverField) {
                 try {
                     clearAnnotation(ctClass, cleanOverCLass, cleanOverMethod, cleanOverField, toCleanAnnotationPrefix);
@@ -117,7 +117,8 @@ public final class JavassistUtil {
      * @param cleanOverMethod 是否清空方法上的注解
      * @param cleanOverField 是否清空字段上的注解
      */
-    private static void clearAnnotation(CtClass ctClass, boolean cleanOverCLass, boolean cleanOverMethod, boolean cleanOverField, String toCleanAnnotationPrefix) {
+    private static void clearAnnotation(CtClass ctClass, boolean cleanOverCLass, boolean cleanOverMethod,
+                                        boolean cleanOverField, String toCleanAnnotationPrefix) {
         // 清空类上的注解
         if (cleanOverCLass) {
             removeAnnotationsAttribute(ctClass.getClassFile().getAttributes(), toCleanAnnotationPrefix);
@@ -142,6 +143,7 @@ public final class JavassistUtil {
      * 移除注解属性
      *
      * @param attributeInfoList 属性信息集合
+     *
      * @return 操作是否成功
      */
     @SuppressWarnings("UnusedReturnValue")
@@ -176,10 +178,8 @@ public final class JavassistUtil {
     /**
      * 加载paths指定的.jar文件(或加载对应子孙目录下的所有jar包)
      *
-     * @param classPool
-     *            javassist的classPool
-     * @param paths
-     *            要加载的文件夹或jar包
+     * @param classPool javassist的classPool
+     * @param paths 要加载的文件夹或jar包
      */
     public static void loadJar(ClassPool classPool, String... paths) throws NotFoundException {
         if (paths == null) {
@@ -193,10 +193,8 @@ public final class JavassistUtil {
     /**
      * 加载指定的.class文件(或加载对应子孙目录下的所有.class文件)
      *
-     * @param classPool
-     *            javassist的classPool
-     * @param paths
-     *            要加载的文件夹或.class文件
+     * @param classPool javassist的classPool
+     * @param paths 要加载的文件夹或.class文件
      */
     public static void loadClass(ClassPool classPool, String... paths) throws NotFoundException {
         if (paths == null) {
@@ -224,8 +222,8 @@ public final class JavassistUtil {
     /**
      * 清空方法体,并且保留原参数名
      *
-     * @param ctMethod
-     *            javassist的方法对象
+     * @param ctMethod javassist的方法对象
+     *
      * @throws CannotCompileException 编译异常
      * @throws NotFoundException 确实类异常
      */
@@ -281,10 +279,8 @@ public final class JavassistUtil {
     /**
      * 加载指定的jar包(或加载对应子孙目录下的所有jar包)
      *
-     * @param pool
-     *            javassist的ClassPool
-     * @param dirOrFile
-     *            要加载的文件夹或.jar文件
+     * @param pool javassist的ClassPool
+     * @param dirOrFile 要加载的文件夹或.jar文件
      */
     private static void loadJar(ClassPool pool, File dirOrFile) throws NotFoundException {
         if (dirOrFile == null || !dirOrFile.exists()) {
@@ -299,10 +295,8 @@ public final class JavassistUtil {
     /**
      * 加载指定的.class文件(或加载对应子孙目录下的所有.class文件)
      *
-     * @param pool
-     *            javassist的ClassPool
-     * @param dirOrFile
-     *            要加载的文件夹或.class文件
+     * @param pool javassist的ClassPool
+     * @param dirOrFile 要加载的文件夹或.class文件
      */
     private static void loadClasses(ClassPool pool, File dirOrFile) throws NotFoundException {
         if (dirOrFile == null || !dirOrFile.exists()) {
@@ -324,21 +318,19 @@ public final class JavassistUtil {
             pool.insertClassPath(rootDir);
         }
     }
-
+    
     /**
      * 根据class的绝对路径解析出class全类名(或class全类名文件所在的目录路径)
-     * <p>
-     *     假设文件的全路径名是这样的/tmp/class-winter-core/src/main/java/com/niantou/iwork/core/Abc.class,
-     *     那么, 解析出来的class全类名即为com.niantou.iwork.core.Abc
-     *          解析出来的class全类名文件所在的目录路径即为/tmp/class-winter-core/src/main/java
+     * <pre>
+     * 假设文件的全路径名是这样的/tmp/class-winter-core/src/main/java/com/niantou/iwork/core/Abc.class,
+     * 那么, 解析出来的class全类名即为com.niantou.iwork.core.Abc
+     *       解析出来的class全类名文件所在的目录路径即为/tmp/class-winter-core/src/main/java
+     * </pre>
      *
-     * </p>
+     * @param fileName class文件的绝对路径
+     * @param classOrPath true-解析全类名;false-解析全类名文件所在的目录路径
      *
-     * @param fileName
-     *            class文件的绝对路径
-     * @param classOrPath
-     *            true-解析全类名;false-解析全类名文件所在的目录路径
-     * @return  class所代表类的全类名(如com.aaa.bbb.Abc) 或者路径(如: /tmp/class-winter-core/src/main/java)
+     * @return class所代表类的全类名(如com.aaa.bbb.Abc) 或者路径(如: /tmp/class-winter-core/src/main/java)
      */
     public static String resolveClassName(String fileName, boolean classOrPath) {
         // 去除后缀名
@@ -375,5 +367,5 @@ public final class JavassistUtil {
         classPath = nonSuffixFileName.substring(0, nonSuffixFileName.length() - className.length() - 1);
         return classOrPath ? className.replace(File.separator, ".") : classPath;
     }
-
+    
 }

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AllTest.java

@@ -18,7 +18,7 @@ import winter.com.ideaaedi.classwinter.util.PathUtil;
 public class AllTest {
     
     public static void main(String[] args) {
-//        xmlTest();
+//      xmlTest();
         otherTest();
         
         // 杀下进程(结束拉起的jar程序)
@@ -77,7 +77,7 @@ public class AllTest {
         String alreadyProtectedLibs = "encrypted-lib-have-pwd-1.0.0.jar:qwer123~";
         String jvmArgCheck = "-XX:+DisableAttachMechanism";
         String debug = "true";
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " excludePrefix=" + excludePrefix

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AlreadyProtectedLibs_Test.java

@@ -67,7 +67,7 @@ public class AlreadyProtectedLibs_Test {
         String originJarOrWar = projectRootDir + Constant.LINUX_FILE_SEPARATOR + "my-project-with-encrypted-lib-no-pwd.jar";
         String includePrefix = "non-exist";
         String alreadyProtectedLibs = "encrypted-lib-no-pwd-1.0.0.jar";
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " alreadyProtectedLibs=" + alreadyProtectedLibs
@@ -110,7 +110,7 @@ public class AlreadyProtectedLibs_Test {
         String includePrefix = "non-exist";
         String alreadyProtectedLibs = "encrypted-lib-have-pwd-1.0.0.jar:qwer123~";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " alreadyProtectedLibs=" + alreadyProtectedLibs

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Debug_Test.java

@@ -36,7 +36,7 @@ public class Debug_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 ;
@@ -64,7 +64,7 @@ public class Debug_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true

+ 5 - 3
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/EncryptArgParam_Test.java

@@ -28,6 +28,7 @@ public class EncryptArgParam_Test {
 //        argMap.put(Constant.CLEAN_CLASS_ANNOTATION_PARAM_NAME, "true");  // 默认为false
 //        argMap.put(Constant.CLEAN_METHOD_ANNOTATION_PARAM_NAME, "true");  // 默认为false
 //        argMap.put(Constant.CLEAN_FIELD_ANNOTATION_PARAM_NAME, "true"); // 默认为false
+//        argMap.put(Constant.KEEP_ORIGIN_ARGS_NAME, "false"); // 默认为true
 //        have(argMap);
     
 //        // 测试3: 有参数测试
@@ -35,6 +36,7 @@ public class EncryptArgParam_Test {
 //        argMap.put(Constant.CLEAN_CLASS_ANNOTATION_PARAM_NAME, "false");  // 默认为false
 //        argMap.put(Constant.CLEAN_METHOD_ANNOTATION_PARAM_NAME, "true");  // 默认为false
 //        argMap.put(Constant.CLEAN_FIELD_ANNOTATION_PARAM_NAME, "false"); // 默认为false
+//        argMap.put(Constant.KEEP_ORIGIN_ARGS_NAME, "false"); // 默认为true
 //        have(argMap);
     
         // 测试4: 有参数测试
@@ -43,8 +45,8 @@ public class EncryptArgParam_Test {
         argMap.put(Constant.CLEAN_METHOD_ANNOTATION_PARAM_NAME, "false");  // 默认为false
         argMap.put(Constant.CLEAN_FIELD_ANNOTATION_PARAM_NAME, "true"); // 默认为false
         // 这里仅作测试实际清除spring boot注解会有问题 ,spring ClassReader读的是本地classfile 所以清除的spring 注解读取不到了
-        argMap.put(Constant.TO_CLEAN_FIELD_ANNOTATION_PREFIX, "org.springframework.context.annotation.Configuration"); // 默认为''
-
+        argMap.put(Constant.TO_CLEAN_ANNOTATION_PREFIX, "org.springframework.boot.autoconfigure.SpringBootApplication"); // 默认为''
+        argMap.put(Constant.KEEP_ORIGIN_ARGS_NAME, "true"); // 默认为true
         have(argMap);
     }
     
@@ -70,7 +72,7 @@ public class EncryptArgParam_Test {
             includePrefix= sb.toString();
         }
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=true"

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/ExcludePrefix_Test.java

@@ -38,7 +38,7 @@ public class ExcludePrefix_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com.aspire.ssm.util.AesEncryptDecryptUtil,com.aspire.ssm.util.DbSecurityBeanUtil";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true
@@ -72,7 +72,7 @@ public class ExcludePrefix_Test {
         String includePrefix = "com.aspire.ssm.util.AesEncryptDecryptUtil,com.aspire.ssm.util.DbSecurityBeanUtil";
         String excludePrefix = "com.aspire.*.DbSecurityBeanUtil";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " excludePrefix=" + excludePrefix

+ 1 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/FinalName_Test.java

@@ -23,7 +23,7 @@ public class FinalName_Test {
         String includePrefix = "com";
         String finalName = "YiYaKaKa";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " finalName=" + finalName

+ 1 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludeLibs_Test.java

@@ -42,7 +42,7 @@ public class IncludeLibs_Test {
         String includePrefix = "org.springframework.aop.target.dynamic,com.google.common.xml";
         String includeLibs = "spring-aop-.*.RELEASE.jar,guava-28.2-jre.jar";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " includeLibs=" + includeLibs

+ 1 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludePrefix_Test.java

@@ -39,7 +39,7 @@ public class IncludePrefix_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com.aspire.*.util";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true

+ 3 - 3
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/JvmArgCheck_Test.java

@@ -33,7 +33,7 @@ public class JvmArgCheck_Test {
     
         String jvmArg = "-XX:+DisableAttachMechanism,-Xms1024M";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " jvmArgCheck=" + jvmArg
@@ -65,7 +65,7 @@ public class JvmArgCheck_Test {
     
         String jvmArg = "-XX:+DisableAttachMechanism,-Xms1024M";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " jvmArgCheck=" + jvmArg
@@ -97,7 +97,7 @@ public class JvmArgCheck_Test {
     
         String jvmArg = "-XX:+DisableAttachMechanism";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " jvmArgCheck=" + jvmArg

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/OriginJarOrWar_Test.java

@@ -32,7 +32,7 @@ public class OriginJarOrWar_Test {
         String originJarOrWar = projectRootDir + "non-exist.jar";
         String includePrefix = "com.aspire.ssm.util";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true
@@ -58,7 +58,7 @@ public class OriginJarOrWar_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com.aspire.ssm.util";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " debug=" + true

+ 3 - 3
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Password_Test.java

@@ -34,7 +34,7 @@ public class Password_Test {
         String includePrefix = "com";
         String password = "pwd123";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " password=" + password
@@ -65,7 +65,7 @@ public class Password_Test {
         String includePrefix = "com";
         String password = "pwd123";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " password=" + password
@@ -97,7 +97,7 @@ public class Password_Test {
         String includePrefix = "com";
         String password = "pwd123";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " password=" + password

+ 2 - 2
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/SupportFile_Test.java

@@ -42,7 +42,7 @@ public class SupportFile_Test {
         String originJarOrWar = projectRootDir + "normal-jar.jar";
         String includePrefix = "com";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 ;
@@ -62,7 +62,7 @@ public class SupportFile_Test {
         String includePrefix = "com";
         String supportFile = projectRootDir + "help";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " supportFile=" + supportFile

+ 3 - 3
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Tips_Test.java

@@ -32,7 +32,7 @@ public class Tips_Test {
         String originJarOrWar = projectRootDir + "boot-jar.jar";
         String includePrefix = "com";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 ;
@@ -55,8 +55,8 @@ public class Tips_Test {
         String tips = "[潘嘎之交] 潘: 你别怪潘叔说话比较直白, 网络上的东西都是虚拟的, 你把握不住, 孩子! 因为这里的水很深...";
     
         // 如果tips值由一些特殊字符(如空格等)的话,可以用windows双引号(linux单引号)引起来。
-        // java -jar class-winter-core-2.9.5.jar originJarOrWar=/boot-jar.jar includePrefix=com tips="[潘嘎之交] 潘: 你别怪潘叔说话比较直白, 网络上的东西都是虚拟的, 你把握不住, 孩子! 因为这里的水很深..."
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        // java -jar class-winter-core-2.9.6.jar originJarOrWar=/boot-jar.jar includePrefix=com tips="[潘嘎之交] 潘: 你别怪潘叔说话比较直白, 网络上的东西都是虚拟的, 你把握不住, 孩子! 因为这里的水很深..."
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " tips=" + (BashUtil.IS_WINDOWS ? "\"".concat(tips).concat("\"") : "'".concat(tips).concat("'"));

+ 5 - 5
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/War_Test.java

@@ -34,7 +34,7 @@ public class War_Test {
         String originJarOrWar = projectRootDir + "war-project.war";
         String includePrefix = "com";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 ;
@@ -62,7 +62,7 @@ public class War_Test {
         String includePrefix = "com";
         String password = "123456";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " password=" + password
@@ -93,7 +93,7 @@ public class War_Test {
         String alreadyProtectedLibs = "encrypted-lib-no-pwd.jar";
         String password = "oop857857";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " alreadyProtectedLibs=" + alreadyProtectedLibs
@@ -124,7 +124,7 @@ public class War_Test {
         String alreadyProtectedLibs = "encrypted-lib-have-pwd.jar:qwer123~";
         String password = "yiyakaka";
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " alreadyProtectedLibs=" + alreadyProtectedLibs
@@ -160,7 +160,7 @@ public class War_Test {
         String alreadyProtectedLibs = "encrypted-lib-have-pwd.jar:qwer123~";
         String debug = "true";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " excludePrefix=" + excludePrefix

+ 1 - 1
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Xml_Test.java

@@ -31,7 +31,7 @@ public class Xml_Test {
         String toCleanXmlChildElementName = "select";
         
         
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.5.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.9.6.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " includeXmlPrefix=" + includeXmlPrefix

BIN
class-winter-core/src/test/resources/class-winter-core-2.9.5.jar


BIN
class-winter-core/src/test/resources/class-winter-core-2.9.6.jar