ソースを参照

Merge branch 'master' into release-2.6.9

JustryDeng 3 年 前
コミット
1ef79ebe0e
22 ファイル変更131 行追加65 行削除
  1. 42 17
      README.md
  2. 1 1
      class-winter-core/pom.xml
  3. 2 0
      class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/Forward.java
  4. 50 16
      class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/executor/EncryptExecutor.java
  5. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AllTest.java
  6. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/AlreadyProtectedLibs_Test.java
  7. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Debug_Test.java
  8. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/ExcludePrefix_Test.java
  9. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/FinalName_Test.java
  10. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludeLibs_Test.java
  11. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/IncludePrefix_Test.java
  12. 3 3
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/JvmArgCheck_Test.java
  13. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/OriginJarOrWar_Test.java
  14. 3 3
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Password_Test.java
  15. 2 2
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/SupportFile_Test.java
  16. 3 3
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Tips_Test.java
  17. 5 5
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/War_Test.java
  18. 1 1
      class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/Xml_Test.java
  19. BIN
      class-winter-core/src/test/resources/class-winter-core-2.7.0.jar
  20. 1 1
      class-winter-maven-plugin/pom.xml
  21. 5 0
      class-winter-maven-plugin/src/main/java/winter/com/ideaaedi/classwinter/plugin/ClassWinterPlugin.java
  22. 1 1
      pom.xml

+ 42 - 17
README.md

@@ -1,6 +1,7 @@
 # 代码混淆之class-winter
 
 - [代码混淆之class-winter](#代码混淆之class-winter)
+  - [环境要求](#环境要求)
   - [功能与特性](#功能与特性)
   - [加密](#加密)
   - [加密参数](#加密参数)
@@ -14,6 +15,18 @@
 
 [**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语法的环境即可
+
+  注:tomcat版本不能低于8,否则可能报错
+
+  ```bash
+  org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost...
+  ```
+
+  注:如果有兼容低版本jdk的需求,可以自己下载master分支代码,进行对应修改
+
 ## <font  face="幼圆" color = "#3399EA" >功能与特性</font>
 
 - 支持war(普通war+可执行war)加密
@@ -32,7 +45,7 @@
   <plugin>
       <groupId>com.idea-aedi</groupId>
       <artifactId>class-winter-maven-plugin</artifactId>
-      <version>2.6.9</version>
+      <version>2.7.0</version>
       <!-- 相关配置 -->
       <configuration>
           <!-- <finalName></finalName>-->
@@ -62,15 +75,15 @@
   ```
   注:不必担心信息泄漏问题,使用此方式生成混淆的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.6.9.jar) 主动加密</font>
+- #### <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.7.0.jar) 主动加密</font>
 
   ```bash
-  java -jar class-winter-core-2.6.9.jar originJarOrWar=${要加密的项目.jar或.war包} includePrefix=${加密范围} [k3=v3 k4=v4 ...]
+  java -jar class-winter-core-2.7.0.jar originJarOrWar=${要加密的项目.jar或.war包} includePrefix=${加密范围} [k3=v3 k4=v4 ...]
   # 对于复杂的参数值,可以使用引号引起来
   # linux
-  java -jar class-winter-core-2.6.9.jar k1='v1' k2='v2'
+  java -jar class-winter-core-2.7.0.jar k1='v1' k2='v2'
   # windows
-  java -jar class-winter-core-2.6.9.jar k1="v1" k2="v2"
+  java -jar class-winter-core-2.7.0.jar k1="v1" k2="v2"
   ```
 
 ## <font  face="幼圆" color = "#3399EA" >加密参数</font>
@@ -170,6 +183,17 @@ excludeXmlPrefix=BOOT-INF/classes/com/demo/mapper/,BOOT-INF/classes/com/demo/dao
 <br/>
 注:lib中的class是否会被加密,还得由includePrefix和excludePrefix决定。</td>
     <td>includeLibs=a.jar,b.jar</td>
+  </tr>
+    <tr align="center">
+    <td>alreadyProtectedRootDir</td>
+    <td>否</td>
+    <td>指明已加密lib包所在根目录(,可为空,为空时自动根据当前是jar还是war,去包内对应找lib)
+    <br/>
+注:当指定此参数时,也会优先去jar/war内部找对应的lib包,找不到时,才会去此参数指定的根目录下找lib包。
+<br/>
+注:在一些外置lib的项目中,可能需要用到此参数;如果是内置lib,忽略此参数即可。
+<br/>注:此参数由2.7.0版本开始支持</td>
+    <td>alreadyProtectedRootDir=/lib</td>
   </tr>
     <tr align="center">
     <td>alreadyProtectedLibs</td>
@@ -235,6 +259,7 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
 
 
 
+
 ## <font  face="幼圆" color = "#3399EA" >解密(启动)</font>
 
 通过-javaagent指定代理进行解密启动。
@@ -242,8 +267,8 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
   ```bash
   # 假设your-project-encrypted.jar是由class-winter加密后的包,那么你可以这么启动
   java -javaagent:/your-project-encrypted.jar -jar /your-project-encrypted.jar
-  # 也可以用class-winter-core-2.6.9.jar
-  # java -javaagent:/class-winter-core-2.6.9.jar -jar /your-project-encrypted.jar
+  # 也可以用class-winter-core-2.7.0.jar
+  # java -javaagent:/class-winter-core-2.7.0.jar -jar /your-project-encrypted.jar
   # 或者指定参数
   # java -javaagent:/your-project-encrypted.jar=debug=true,password=pwd12345 -jar /your-project-encrypted.jar
   # 参数可以引起来(linux)
@@ -259,8 +284,8 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
     编辑tomcat/bin/catalina.sh文件,在最上面加上
 
     ```bash
-    # 如果你有参数, 那么 -javaagent:/class-winter-core-2.6.9.jar=k1=v1,k2=v2
-    CATALINA_OPTS="$CATALINA_OPTS -javaagent:/class-winter-core-2.6.9.jar=debug=true";
+    # 如果你有参数, 那么 -javaagent:/class-winter-core-2.7.0.jar=k1=v1,k2=v2
+    CATALINA_OPTS="$CATALINA_OPTS -javaagent:/class-winter-core-2.7.0.jar=debug=true";
     export CATALINA_OPTS;
     ```
 
@@ -269,8 +294,8 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
     在tomcat/bin目录下创建setenv.sh文件,并写上
 
     ```bash
-    # 如果你有参数, 那么 -javaagent:/class-winter-core-2.6.9.jar=k1=v1,k2=v2
-    JAVA_OPTS="$JAVA_OPTS -javaagent:/class-winter-core-2.6.9.jar=debug=true";
+    # 如果你有参数, 那么 -javaagent:/class-winter-core-2.7.0.jar=k1=v1,k2=v2
+    JAVA_OPTS="$JAVA_OPTS -javaagent:/class-winter-core-2.7.0.jar=debug=true";
     export JAVA_OPTS;
     ```
 
@@ -279,8 +304,8 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
     编辑tomcat/bin/catalina.bat文件,在@echo off后加上catalina参数
 
     ```bash
-    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.6.9.jar=k1=v1,k2=v2
-    set CATALINA_OPTS="-javaagent:D:/class-winter-core-2.6.9.jar"
+    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.7.0.jar=k1=v1,k2=v2
+    set CATALINA_OPTS="-javaagent:D:/class-winter-core-2.7.0.jar"
     ```
 
   - windows方式二
@@ -288,8 +313,8 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
     在tomcat/bin目录下创建setenv.bat文件,并写上
 
     ```bash
-    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.6.9.jar=k1=v1,k2=v2
-    set JAVA_OPTS="-javaagent:D:/class-winter-core-2.6.9.jar"
+    rem 如果你有参数, 那么 -javaagent:D:/class-winter-core-2.7.0.jar=k1=v1,k2=v2
+    set JAVA_OPTS="-javaagent:D:/class-winter-core-2.7.0.jar"
     ```
 
 - #### <font  face="幼圆" color = "#86CA5E" >IDE解密(启动)</font>
@@ -324,7 +349,7 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
       <tr align="center">
     <td>passwordFromShell</td>
     <td>否</td>
-    <td>执行shell文件中的代码,并以其返值作为解密密码<br/>注:此参数由2.4.0版本开始支持</td>
+    <td>执行shell文件中的代码,并以其返值作为解密密码<br/>注:此参数由2.4.0版本开始支持</td>
     <td>passwordFromShell=/my-pwd-file.shell</td>
   </tr>
     <tr align="center">
@@ -384,7 +409,7 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
         <parent>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-parent</artifactId>
-            <version>2.6.9</version>
+            <version>2.7.0</version>
             <relativePath/> <!-- lookup parent from repository -->
         </parent>
         <groupId>com.example</groupId>

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

@@ -5,7 +5,7 @@
     <parent>
         <groupId>com.idea-aedi</groupId>
         <artifactId>class-winter</artifactId>
-        <version>2.6.9</version>
+        <version>2.7.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 2 - 0
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/Forward.java

@@ -37,6 +37,7 @@ public class Forward {
         String finalName = parseValueByPrefixFromTail("finalName=", args);
         String password = parseValueByPrefixFromTail("password=", args);
         String includeLibs = parseValueByPrefixFromTail("includeLibs=", args);
+        String alreadyProtectedRootDir = parseValueByPrefixFromTail("alreadyProtectedRootDir=", args);
         String alreadyProtectedLibs = parseValueByPrefixFromTail("alreadyProtectedLibs=", args);
         String tips = parseValueByPrefixFromTail("tips=", args);
         String supportFile = parseValueByPrefixFromTail("supportFile=", args);
@@ -70,6 +71,7 @@ public class Forward {
                 .finalName(finalName)
                 .password(password)
                 .includeLibs(includeLibs)
+                .alreadyProtectedRootDir(alreadyProtectedRootDir)
                 .alreadyProtectedLibs(alreadyProtectedLibs)
                 .debug(Boolean.parseBoolean(debug))
                 .supportFile(supportFile)

+ 50 - 16
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/executor/EncryptExecutor.java

@@ -133,7 +133,7 @@ public class EncryptExecutor {
     
     /**
      * 要加密的lib包(若不指定,则加密筛选范围默认仅从项目代码本身进行筛选加密)。
-     * <p>
+     * <pre>
      *  提示: 不论项目里面的依赖的传递关系是怎样的,这里只需要指定需要加密的jar包全称即可。
      *  说明:假设我们项目的pom依赖关系为:  myProject -> a -> b  -> c
      *      即: 我们的项目myProject直接依赖的是a,我们在pom中主动指定依赖的也是a,没有主动指定需要依赖b和c,但是由于maven依赖传递的原因,
@@ -147,26 +147,38 @@ public class EncryptExecutor {
      *           │     └─b.jar
      *           │     └─c.jar
      *           这里,如果需要对a、b、c进行加密的话,只需要使includeLibSet值为["a.jar","b.jar","c.jar"]即可
+     * </pre>
      */
     private final Set<String> includeLibSet;
     
     /**
      * 不需要加密的类的全类名前缀(也可以精确匹配)
-     * <p>
-     *     includePrefixSet匹配的类中再排除excludePrefixSet匹配的类,即为最终会被加密的类
+     * <pre>
+     * includePrefixSet匹配的类中再排除excludePrefixSet匹配的类,即为最终会被加密的类
+     * </pre>
      */
     private final Set<String> excludePrefixSet;
     
+    /**
+     * 已加密lib包所在根目录(,可为空,为空时自动根据当前是jar还是war,去包内对应找lib)
+     * <br />
+     * 特别注意:当指定此参数时,也会优先去jar/war内部找对应的lib包,找不到时,才会去此参数指定的根目录下找lib包
+     * <pre>
+     *  在一些外置lib的项目中,可能需要用到此参数;如果是内置lib,忽略此参数即可
+     * </pre>
+     */
+    private String alreadyProtectedRootDir;
+    
     /**
      * 已经被class-winter加密过了的lib的信息
-     * <p>
+     * <pre>
      *    每个pair对象的属性介绍:
      *        pair-左: lib包名,如: abc.jar
      *        pair-右: 加密该lib时的密码
-     * <p>
      *  想一想这种case:
      *      第三方给你提供了一个被class-winter加密过的jar包,你把这个jar包依赖进你的项目your-project中,
      *      你想正常的运行起来项目,那么你就需要用到这个属性了。
+     * </pre>
      */
     private final Set<Pair<String, String>> alreadyProtectedLibSet;
     
@@ -207,7 +219,8 @@ public class EncryptExecutor {
                             String targetLibDir, String targetClassesDir, String password,
                             Set<String> includeXmlPrefixSet, Set<String> excludeXmlPrefixSet, Set<String> toCleanXmlChildElementNameSet,
                             Set<String> includePrefixSet, Set<String> excludePrefixSet, Set<String> includeLibSet,
-                            Set<Pair<String, String>> alreadyProtectedLibSet, String supportFile, Set<String> jvmArgCheckSet) {
+                            String alreadyProtectedRootDir, Set<Pair<String, String>> alreadyProtectedLibSet,
+                            String supportFile, Set<String> jvmArgCheckSet) {
         this.originJarOrWar = originJarOrWar;
         this.originIsJar = originIsJar;
         this.finalName = finalName;
@@ -221,6 +234,7 @@ public class EncryptExecutor {
         this.includePrefixSet = includePrefixSet;
         this.excludePrefixSet = excludePrefixSet;
         this.includeLibSet = includeLibSet;
+        this.alreadyProtectedRootDir = alreadyProtectedRootDir;
         this.alreadyProtectedLibSet = alreadyProtectedLibSet;
         this.supportFile = supportFile;
         this.jvmArgCheckSet = jvmArgCheckSet;
@@ -479,14 +493,26 @@ public class EncryptExecutor {
          */
         Map<String, String> allChecklistInfoMap = new HashMap<>(8);
         alreadyProtectedLibSet.forEach(pair -> {
-            String libJarName = pair.getLeft();
+            String libJarFilepath = pair.getLeft();
             String password = pair.getRight();
-            File lib = new File(targetLibDir, libJarName);
+            // 定位lib
+            File lib = new File(targetLibDir, libJarFilepath);
             if (!lib.exists()) {
-                return;
+                if (StrUtil.isBlank(alreadyProtectedRootDir)) {
+                    Logger.warn("do locate lib. " + libJarFilepath+ " non-exist. Under targetLibDir " + targetLibDir);
+                } else {
+                    lib = new File(alreadyProtectedRootDir, libJarFilepath);
+                }
+                if (lib.exists()) {
+                    Logger.debug("do locate lib. " + libJarFilepath+ " exist. Under alreadyProtectedRootDir " + alreadyProtectedRootDir);
+                } else {
+                    Logger.warn("do locate lib. " + libJarFilepath+ " non-exist. Under alreadyProtectedRootDir " + alreadyProtectedRootDir);
+                    return;
+                }
             }
             // 形如: META-INF/winter/abc-1.0.0_jar/
-            String nonSuffixLibName = libJarName.substring(0, libJarName.length() - 4);
+            String libName = lib.getName();
+            String nonSuffixLibName = libName.substring(0, libName.length() - 4);
             String dirRelativePathForLib = Constant.DEFAULT_ENCRYPTED_CLASSES_SAVE_DIR + nonSuffixLibName + "_jar" + Constant.LINUX_FILE_SEPARATOR;
             String dirAbsolutePathForLib = this.targetRootDir + File.separator + Constant.DEFAULT_ENCRYPTED_CLASSES_SAVE_DIR + nonSuffixLibName + "_jar" + File.separator;
     
@@ -499,7 +525,7 @@ public class EncryptExecutor {
              */
             byte[] checklistOfAllLibsByte = IOUtil.readFileFromWorkbenchRoot(lib, Constant.CHECKLIST_OF_ALL_LIBS);
             if (checklistOfAllLibsByte != null) {
-                throw new ClassWinterException(libJarName+"'s lib cannot be protected by class-winter.");
+                throw new ClassWinterException(libJarFilepath+"'s lib cannot be protected by class-winter.");
             }
             
             // 清单文件
@@ -527,7 +553,7 @@ public class EncryptExecutor {
             byte[] libSealByte = IOUtil.readFileFromWorkbenchRoot(lib, Constant.SEAL_FILE);
             if (libSealByte == null) {
                 // lib中没有印章文件
-                throw new ClassWinterException("Cannot find seal in lib [" + libJarName + "]. This lib is not "
+                throw new ClassWinterException("Cannot find seal in lib [" + libJarFilepath + "]. This lib is not "
                         + "protected by class-winter.");
             } else {
                 IOUtil.writeContentToFile(new String(libSealByte, StandardCharsets.UTF_8), new File(dirAbsolutePathForLib,
@@ -537,16 +563,16 @@ public class EncryptExecutor {
             // 密码
             // libUserIfInputPwd代表的意思是: 对lib进行混淆的时候,用户是否主动指定了密码
             boolean libUserIfInputPwd = Boolean.parseBoolean(new String(IOUtil.readFileFromWorkbenchRoot(lib, Constant.USER_IF_INPUT_PWD)));
-            Logger.debug(EncryptExecutor.class, "libUserIfInputPwd info of lib [" + libJarName + "] -> " + libUserIfInputPwd);
+            Logger.debug(EncryptExecutor.class, "libUserIfInputPwd info of lib [" + libJarFilepath + "] -> " + libUserIfInputPwd);
             if (libUserIfInputPwd && StrUtil.isBlank(password)) {
                 // 加密lib时,用户主动指定了密码,那么这里password就不应该为空
-                throw new ClassWinterException("Password is required to decrypt lib [" + libJarName + "]");
+                throw new ClassWinterException("Password is required to decrypt lib [" + libJarFilepath + "]");
             }
             if (StrUtil.isBlank(password)) {
                 byte[] libEncryptedPwdByte = IOUtil.readFileFromWorkbenchRoot(lib, Constant.PWD_WINTER);
                 if (libEncryptedPwdByte == null) {
                     // lib中没有密码文件,请指定此lib的密码
-                    throw new ClassWinterException("Cannot find pwd from lib [" + libJarName + "]");
+                    throw new ClassWinterException("Cannot find pwd from lib [" + libJarFilepath + "]");
                 } else {
                     // 因为写之前是加密写进去的,那么这里解密一下得到明文
                     // 存时,是加密存进去的; 这里读取时,(用lib的印章)解密一下
@@ -970,6 +996,8 @@ public class EncryptExecutor {
         private String toCleanXmlChildElementName;
         
         private String includeLibs;
+    
+        private String alreadyProtectedRootDir;
         
         private String alreadyProtectedLibs;
         
@@ -1031,6 +1059,11 @@ public class EncryptExecutor {
             return this;
         }
         
+        public Builder alreadyProtectedRootDir(String alreadyProtectedRootDir) {
+            this.alreadyProtectedRootDir = alreadyProtectedRootDir;
+            return this;
+        }
+        
         public Builder supportFile(String supportFile) {
             this.supportFile = supportFile;
             return this;
@@ -1144,9 +1177,10 @@ public class EncryptExecutor {
             Set<String> excludeXmlPrefixSet = StrUtil.strToSet(excludeXmlPrefix);
             toCleanXmlChildElementName = StrUtil.isBlank(toCleanXmlChildElementName) ? Constant.DEFAULT_XML_NODE_NAMES : toCleanXmlChildElementName;
             Set<String> toCleanXmlChildElementNameSet = StrUtil.strToSet(toCleanXmlChildElementName);
+            
             return new EncryptExecutor(this.originJarOrWar, originIsJar, this.finalName, targetRootDir, targetLibDir, targetClassesDir,
                     password, includeXmlPrefixSet, excludeXmlPrefixSet, toCleanXmlChildElementNameSet, includePrefixSet,
-                    excludePrefixSet, includeLibSet, alreadyProtectedLibSet, this.supportFile, jvmArgCheckSet);
+                    excludePrefixSet, includeLibSet, alreadyProtectedRootDir, alreadyProtectedLibSet, this.supportFile, jvmArgCheckSet);
         }
     
         /**

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

@@ -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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.ssm.util.DbSecurityBeanUtil";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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-5.1.8.RELEASE.jar,guava-28.2-jre.jar";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.ssm.util";
     
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 ;
@@ -55,8 +55,8 @@ public class Tips_Test {
         String tips = "[潘嘎之交] 潘: 你别怪潘叔说话比较直白, 网络上的东西都是虚拟的, 你把握不住, 孩子! 因为这里的水很深...";
     
         // 如果tips值由一些特殊字符(如空格等)的话,可以用windows双引号(linux单引号)引起来。
-        // java -jar class-winter-core-2.6.9.jar originJarOrWar=/boot-jar.jar includePrefix=com tips="[潘嘎之交] 潘: 你别怪潘叔说话比较直白, 网络上的东西都是虚拟的, 你把握不住, 孩子! 因为这里的水很深..."
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.6.9.jar"
+        // java -jar class-winter-core-2.7.0.jar originJarOrWar=/boot-jar.jar includePrefix=com tips="[潘嘎之交] 潘: 你别怪潘叔说话比较直白, 网络上的东西都是虚拟的, 你把握不住, 孩子! 因为这里的水很深..."
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.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.6.9.jar"
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.7.0.jar"
                 + " originJarOrWar=" + originJarOrWar
                 + " includePrefix=" + includePrefix
                 + " includeXmlPrefix=" + includeXmlPrefix

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


+ 1 - 1
class-winter-maven-plugin/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <groupId>com.idea-aedi</groupId>
         <artifactId>class-winter</artifactId>
-        <version>2.6.9</version>
+        <version>2.7.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 5 - 0
class-winter-maven-plugin/src/main/java/winter/com/ideaaedi/classwinter/plugin/ClassWinterPlugin.java

@@ -54,6 +54,9 @@ public class ClassWinterPlugin extends AbstractMojo {
     @Parameter
     private String includeLibs;
     
+    @Parameter
+    private String alreadyProtectedRootDir;
+    
     @Parameter
     private String alreadyProtectedLibs;
     
@@ -84,6 +87,7 @@ public class ClassWinterPlugin extends AbstractMojo {
         Logger.debug("You config arg finalName -> " + finalName);
         Logger.debug("You config arg password -> " + password);
         Logger.debug("You config arg includeLibs -> " + includeLibs);
+        Logger.debug("You config arg alreadyProtectedRootDir -> " + alreadyProtectedRootDir);
         Logger.debug("You config arg alreadyProtectedLibs -> " + alreadyProtectedLibs);
         Logger.debug("You config arg supportFile -> " + supportFile);
         Logger.debug("You config arg jvmArgCheck -> " + jvmArgCheck);
@@ -107,6 +111,7 @@ public class ClassWinterPlugin extends AbstractMojo {
                 .excludeXmlPrefix(excludeXmlPrefix)
                 .toCleanXmlChildElementName(toCleanXmlChildElementName)
                 .includeLibs(includeLibs)
+                .alreadyProtectedRootDir(alreadyProtectedRootDir)
                 .alreadyProtectedLibs(alreadyProtectedLibs)
                 .supportFile(supportFile)
                 .jvmArgCheck(jvmArgCheck)

+ 1 - 1
pom.xml

@@ -9,7 +9,7 @@
     </modules>
     <groupId>com.idea-aedi</groupId>
     <artifactId>class-winter</artifactId>
-    <version>2.6.9</version>
+    <version>2.7.0</version>
 
     <!-- 配置项目的基础信息 -->
     <name>class-winter</name>