邓沙利文 пре 3 година
родитељ
комит
f24ebaeb3d

+ 19 - 5
README.md

@@ -44,6 +44,7 @@
           <!-- <includeLibs></includeLibs>-->
           <!-- <alreadyProtectedLibs></alreadyProtectedLibs>-->
           <!-- <supportFile></supportFile>-->
+          <!-- <jvmArgCheck></jvmArgCheck>-->
           <!-- <tips></tips>-->
           <!-- <debug></debug>-->
       </configuration>
@@ -58,16 +59,16 @@
   </plugin>
   ```
   注:不必担心信息泄漏问题,使用此方式生成混淆的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.4.0.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.5.0.jar) 主动加密。</font>
 
   ```bash
-  java -jar class-winter-core-2.4.0.jar originJarOrWar=${要加密的项目.jar或.war包} includePrefix=${加密范围} [k3=v3 k4=v4 ...]
+  java -jar class-winter-core-2.5.0.jar originJarOrWar=${要加密的项目.jar或.war包} includePrefix=${加密范围} [k3=v3 k4=v4 ...]
   # 对于复杂的参数值,可以使用引号引起来
   # linux
-  java -jar class-winter-core-2.4.0.jar k1='v1' k2='v2'
+  java -jar class-winter-core-2.5.0.jar k1='v1' k2='v2'
   # windows
-  java -jar class-winter-core-2.4.0.jar k1="v1" k2="v2"
+  java -jar class-winter-core-2.5.0.jar k1="v1" k2="v2"
   ```
 
 ## <font  face="幼圆" color = "#3399EA" >加密参数</font>
@@ -195,6 +196,18 @@ alreadyProtectedLibs=a.jar:pwd1,b.jar:pwd2</td>
     <td>supportFile=/abc.jar
     <br/>
 supportFile=/libs</td>
+  </tr>
+    <tr align="center">
+    <td>jvmArgCheck</td>
+    <td>否</td>
+    <td>设置当启动混淆包时,必须要有的jvm参数
+    <br/>
+注:多个通过逗号分割。
+<br/>
+注:大小写不敏感。
+<br/>
+如:通过设置-XX:+DisableAttachMechanism防止运行时dump class,以提高安全性。</td>
+    <td>-XX:+DisableAttachMechanism,-Xms2048M</td>
   </tr>
     <tr align="center">
     <td>tips</td>
@@ -217,6 +230,7 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
 
 
 
+
 ## <font  face="幼圆" color = "#3399EA" >解密(启动)</font>
 
 通过-javaagent指定代理进行解密启动。

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

@@ -35,7 +35,7 @@ public class Forward {
         String alreadyProtectedLibs = parseValueByPrefixFromTail("alreadyProtectedLibs=", args);
         String tips = parseValueByPrefixFromTail("tips=", args);
         String supportFile = parseValueByPrefixFromTail("supportFile=", args);
-        String jvmStartCheck = parseValueByPrefixFromTail("jvmStartCheck=", args);
+        String jvmArgCheck = parseValueByPrefixFromTail("jvmArgCheck=", args);
         String debug = parseValueByPrefixFromTail("debug=", args);
         
         Logger.ENABLE_DEBUG.set(Boolean.parseBoolean(debug));
@@ -51,7 +51,7 @@ public class Forward {
         Logger.debug(Forward.class, "You input arg alreadyProtectedLibs -> " + alreadyProtectedLibs);
         Logger.debug(Forward.class, "You input arg tips -> " + tips);
         Logger.debug(Forward.class, "You input arg supportFile -> " + supportFile);
-        Logger.debug(Forward.class, "You input arg jvmStartCheck -> " + jvmStartCheck);
+        Logger.debug(Forward.class, "You input arg jvmArgCheck -> " + jvmArgCheck);
         Logger.debug(Forward.class, "You input arg debug -> " + debug);
         
         // 构造加密执行器
@@ -68,7 +68,7 @@ public class Forward {
                 .alreadyProtectedLibs(alreadyProtectedLibs)
                 .debug(Boolean.parseBoolean(debug))
                 .supportFile(supportFile)
-                .jvmStartCheck(jvmStartCheck)
+                .jvmArgCheck(jvmArgCheck)
                 .tips(tips)
                 .build();
     

+ 12 - 10
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/Reverses.java

@@ -20,6 +20,7 @@ import java.lang.management.ManagementFactory;
 import java.nio.charset.StandardCharsets;
 import java.security.ProtectionDomain;
 import java.util.Arrays;
+import java.util.Base64;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -98,19 +99,20 @@ public class Reverses {
                     if (firstExec.compareAndSet(false, true)) {
                         //  1.校验启动时是否输入了加密时指定的jvm参数
                         try {
-                            byte[] jvmStartCheckBytes = IOUtil.readFileFromWorkbenchRoot(new File(projectPath), Constant.JVM_START_CHECK_FILE);
-                            if (jvmStartCheckBytes == null) {
-                                throw new IllegalStateException("jvmStartCheckBytes should not be null.");
+                            byte[] jvmArgCheckBytes = IOUtil.readFileFromWorkbenchRoot(new File(projectPath), Constant.JVM_ARG_CHECK_FILE);
+                            if (jvmArgCheckBytes == null) {
+                                throw new IllegalStateException("jvmArgCheckBytes should not be null.");
                             }
-                            String jvmStartCheck = new String(jvmStartCheckBytes, StandardCharsets.UTF_8);
-                            Logger.debug(Reverses.class, "jvmStartCheck is -> " + jvmStartCheck);
-                            if (StrUtil.isBlank(jvmStartCheck)) {
-                                throw new IllegalStateException("jvmStartCheck should not be blank.");
+                            jvmArgCheckBytes = DecryptExecutor.decrypt(projectPath, null, Base64.getDecoder().decode(jvmArgCheckBytes), inputPwd == null ? null : inputPwd.toCharArray());
+                            String jvmArgCheck = new String(jvmArgCheckBytes, StandardCharsets.UTF_8);
+                            Logger.debug(Reverses.class, "jvmArgCheck is -> " + jvmArgCheck);
+                            if (StrUtil.isBlank(jvmArgCheck)) {
+                                throw new IllegalStateException("jvmArgCheck should not be blank.");
                             }
-                            if (!Constant.JVM_START_CHECK_NO_ITEM_CONTENT.equals(jvmStartCheck)) {
+                            if (!Constant.JVM_ARG_CHECK_NO_ITEM_CONTENT.equals(jvmArgCheck)) {
                                 List<String> inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
                                 Logger.debug(Reverses.class, "Parse jvm args -> " + inputArguments);
-                                Arrays.stream(jvmStartCheck.split(Constant.WHITE_SPACE))
+                                Arrays.stream(jvmArgCheck.split(Constant.WHITE_SPACE))
                                         .filter(str -> !StrUtil.isBlank(str))
                                         .forEach(jvmItem -> {
                                             boolean containTargetArg = false;
@@ -126,7 +128,7 @@ public class Reverses {
                                         });
                             }
                         } catch (Exception e) {
-                            Logger.error(Reverses.class, "jvm-start-check fail.");
+                            Logger.error(Reverses.class, "jvm-arg-check fail.");
                             Logger.error(Reverses.class, ExceptionUtil.getStackTraceMessage(e));
                             System.exit(-1);
                             // 上一步System.exit(-1)就退出程序了,照理说是不会走到下面这里的(,不过为了以防万一,这里打出提醒, class-winter失效)

+ 20 - 2
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/executor/DecryptExecutor.java

@@ -61,11 +61,29 @@ public class DecryptExecutor {
         classWinterInfoDir = StrUtil.isBlank(classWinterInfoDir) ? Constant.DEFAULT_ENCRYPTED_CLASSES_SAVE_DIR : classWinterInfoDir;
         // 读取文件
         byte[] bytes = IOUtil.readFileFromWorkbenchRoot(new File(projectPath), classWinterInfoDir + filename);
+        // 解密
+        return decrypt(projectPath, baseWinterInfoDir, bytes, password);
+    }
+    
+    /**
+     * 解密
+     *
+     * @param projectPath
+     *            jar/war文件或目录(如: /tmp/, /tmp/abc.jar等)
+     * @param classWinterInfoDir
+     *            class-winter相关信息的存储目录(如果不指定,则走默认的目录)
+     * @param bytes
+     *            要解密的内容
+     * @param password
+     *            密码
+     * @return  解压后的字节(null-表示classLongName所代表的文件不应该被解密)
+     */
+    public static byte[] decrypt(String projectPath, String classWinterInfoDir, byte[] bytes, char[] password) {
+        String baseWinterInfoDir = StrUtil.isBlank(classWinterInfoDir) ? Constant.DEFAULT_ENCRYPTED_BASE_SAVE_DIR : classWinterInfoDir;
         // 检查密码一致性
         boolean userIfInputPwdWhileDecrypt = checkPwdConsistency(projectPath, baseWinterInfoDir, password);
         // 解密
-        return EncryptUtil.decrypt(bytes, userIfInputPwdWhileDecrypt ? password :
-                obtainAutoGeneratedPwdWhileEncrypt(projectPath, baseWinterInfoDir));
+        return EncryptUtil.decrypt(bytes, userIfInputPwdWhileDecrypt ? password : obtainAutoGeneratedPwdWhileEncrypt(projectPath, baseWinterInfoDir));
     }
     
     /**

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

@@ -39,6 +39,7 @@ import java.nio.charset.StandardCharsets;
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Base64;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -194,7 +195,7 @@ public class EncryptExecutor {
     /**
      * 在启动jar包时,需要进行的jvm输入参数校验
      */
-    private final Set<String> jvmStartCheckSet;
+    private final Set<String> jvmArgCheckSet;
     
     /**
      * 要加密的lib jar文件的绝对路径  &  其对应的加密临时目录
@@ -206,7 +207,7 @@ 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> jvmStartCheckSet) {
+                            Set<Pair<String, String>> alreadyProtectedLibSet, String supportFile, Set<String> jvmArgCheckSet) {
         this.originJarOrWar = originJarOrWar;
         this.originIsJar = originIsJar;
         this.finalName = finalName;
@@ -222,7 +223,7 @@ public class EncryptExecutor {
         this.includeLibSet = includeLibSet;
         this.alreadyProtectedLibSet = alreadyProtectedLibSet;
         this.supportFile = supportFile;
-        this.jvmStartCheckSet = jvmStartCheckSet;
+        this.jvmArgCheckSet = jvmArgCheckSet;
     }
     
     /**
@@ -265,9 +266,9 @@ public class EncryptExecutor {
         showProcess("step05", lastStep, "record-seal");
         generateSealFile();
 
-        // step5. 记录sss(在解密时,可通过 checklist + 印章 判断一个class是否是被class-winter加密过)
-        showProcess("step06", lastStep, "record-jvm-start-check-items");
-        generateJvmStartCheckItems();
+        // step5. 设置启动jar包时需要检查的jvm参数项
+        showProcess("step06", lastStep, "setting-jvm-arg-check-items");
+        settingJvmArgCheckItems();
 
         // step6. 混淆原.class文件(即:清空方法体)
         clearClassMethod(allNeedEncryptedClassFileList);
@@ -643,23 +644,22 @@ public class EncryptExecutor {
     }
     
     /**
-     * 生成记录启动jar包时需要检查的输入参数项文件
+     * 设置启动jar包时需要检查的jvm参数项
      */
-    private void generateJvmStartCheckItems() {
+    private void settingJvmArgCheckItems() {
         String content;
-        if (jvmStartCheckSet == null || jvmStartCheckSet.size() == 0) {
-            content = Constant.JVM_START_CHECK_NO_ITEM_CONTENT;
+        if (jvmArgCheckSet == null || jvmArgCheckSet.size() == 0) {
+            content = Constant.JVM_ARG_CHECK_NO_ITEM_CONTENT;
         } else {
             StringBuilder sb = new StringBuilder(64);
-            for (String checkItem : jvmStartCheckSet) {
+            for (String checkItem : jvmArgCheckSet) {
                 sb.append(checkItem).append(Constant.WHITE_SPACE);
             }
             content = sb.toString();
         }
-        Logger.debug(EncryptExecutor.class, "Generate jvmStartCheckItems -> " + content);
-//        content = Base64.getEncoder().encodeToString(content.getBytes(StandardCharsets.UTF_8));
-//        final byte[] encryptedBytes = EncryptUtil.encrypt(content.getBytes(StandardCharsets.UTF_8), obtainPassword());
-        IOUtil.toFile(content.getBytes(StandardCharsets.UTF_8), new File(targetRootDir, Constant.JVM_START_CHECK_FILE), true);
+        Logger.debug(EncryptExecutor.class, "SeDtting jvmArgCheckItems -> " + content);
+        byte[] encryptedBytes = EncryptUtil.encrypt(content.getBytes(StandardCharsets.UTF_8), obtainPassword());
+        IOUtil.toFile(Base64.getEncoder().encode(encryptedBytes), new File(targetRootDir, Constant.JVM_ARG_CHECK_FILE), true);
     }
     
     /**
@@ -934,7 +934,7 @@ public class EncryptExecutor {
                 // 密码脱敏
                 ", password='" + (StrUtil.isBlank(password) ? null : "******") + '\'' +
                 ", supportFile='" + supportFile + '\'' +
-                ", jvmStartCheckSet='" + jvmStartCheckSet + '\'' +
+                ", jvmArgCheckSet='" + jvmArgCheckSet + '\'' +
                 ", includePrefixSet=" + includePrefixSet +
                 ", excludePrefixSet=" + excludePrefixSet +
                 ", includeXmlPrefixSet=" + includeXmlPrefixSet +
@@ -976,7 +976,7 @@ public class EncryptExecutor {
         
         private String supportFile;
         
-        private String jvmStartCheck;
+        private String jvmArgCheck;
         
         private Boolean debug = false;
         
@@ -1037,8 +1037,8 @@ public class EncryptExecutor {
             return this;
         }
         
-        public Builder jvmStartCheck(String jvmStartCheck) {
-            this.jvmStartCheck = jvmStartCheck;
+        public Builder jvmArgCheck(String jvmArgCheck) {
+            this.jvmArgCheck = jvmArgCheck;
             return this;
         }
         
@@ -1141,13 +1141,13 @@ public class EncryptExecutor {
             
             // xml相关参数解析
             Set<String> includeXmlPrefixSet = StrUtil.strToSet(includeXmlPrefix);
-            Set<String> jvmStartCheckSet = StrUtil.strToSet(jvmStartCheck);
+            Set<String> jvmArgCheckSet = StrUtil.strToSet(jvmArgCheck);
             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, jvmStartCheckSet);
+                    excludePrefixSet, includeLibSet, alreadyProtectedLibSet, this.supportFile, jvmArgCheckSet);
         }
     
         /**

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

@@ -86,17 +86,17 @@ public interface Constant {
     /**
      * 记录启动jar包时需要检查的输入参数项文件 文件名
      */
-    String JVM_START_CHECK_FILE_SIMPLE_NAME = "jscf.winter";
+    String JVM_ARG_CHECK_FILE_SIMPLE_NAME = "jscf.winter";
     
     /**
      * 记录启动jar包时需要检查的输入参数项文件
      */
-    String JVM_START_CHECK_FILE = DEFAULT_ENCRYPTED_BASE_SAVE_DIR + JVM_START_CHECK_FILE_SIMPLE_NAME;
+    String JVM_ARG_CHECK_FILE = DEFAULT_ENCRYPTED_BASE_SAVE_DIR + JVM_ARG_CHECK_FILE_SIMPLE_NAME;
     
     /**
-     * 当JVM_START_CHECK_FILE无检查项时,填写的默认值
+     * 当JVM_ARG_CHECK_FILE无检查项时,填写的默认值
      */
-    String JVM_START_CHECK_NO_ITEM_CONTENT = "NON_CHECK_ITEM_AT_CLASS-WINTER";
+    String JVM_ARG_CHECK_NO_ITEM_CONTENT = "NON_CHECK_ITEM_AT_CLASS-WINTER";
     
     /**
      * pom.xml文件所在的祖辈目录

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

@@ -0,0 +1,118 @@
+package winter.com.ideaaedi.classwinter;
+
+import winter.com.ideaaedi.classwinter.author.JustryDeng;
+import winter.com.ideaaedi.classwinter.util.BashUtil;
+import winter.com.ideaaedi.classwinter.util.PathUtil;
+
+/**
+ * 测试jvmArgCheck
+ * <p>
+ *     jvmArgCheck: 在启动混淆包时,检查是否输入有(在加密时)指定的jvm参数
+ * </p>
+ * @author {@link JustryDeng}
+ * @since 2021/6/12 14:34:45
+ */
+public class JvmArgCheck_Test {
+    
+    public static void main(String[] args) {
+//        jvmCheckJarTestFail();
+//        jvmCheckJarTestSuccess();
+        jvmCheckJarOneTest();
+    }
+    
+    /**
+     * jar测试 - 失败测试
+     */
+    public static void jvmCheckJarTestFail() {
+        // 杀下进程(以保证端口没有被占用)
+        BashUtil.killProcessByPorts("8080");
+        
+        String projectRootDir = PathUtil.getProjectRootDir(AlreadyProtectedLibs_Test.class);
+        String originJarOrWar = projectRootDir + "boot-jar.jar";
+        String includePrefix = "com";
+    
+        String jvmArg = "-XX:+DisableAttachMechanism,-Xms1024M";
+        
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.5.0.jar"
+                + " originJarOrWar=" + originJarOrWar
+                + " includePrefix=" + includePrefix
+                + " jvmArgCheck=" + jvmArg
+                + " debug=true"
+                ;
+        // 加密
+        BashUtil.runBashAndPrint(startBat);
+    
+    
+        String encryptedJar = originJarOrWar.replace(".jar", "-encrypted.jar");
+    
+        // 解密
+        String javaagentArgs = "";
+        // String javaagentArgs = "=debug=true";
+        // String javaagentArgs = "=debug=true,password=xxx";
+        BashUtil.runBashAndPrint(String.format("java -javaagent:%s%s=debug=true -XX:+DisableAttachMechanism -Xms1022M -jar %s", encryptedJar, javaagentArgs, encryptedJar));
+    }
+    
+    /**
+     * jar测试 - 成功测试
+     */
+    public static void jvmCheckJarTestSuccess() {
+        // 杀下进程(以保证端口没有被占用)
+        BashUtil.killProcessByPorts("8080");
+        
+        String projectRootDir = PathUtil.getProjectRootDir(AlreadyProtectedLibs_Test.class);
+        String originJarOrWar = projectRootDir + "boot-jar.jar";
+        String includePrefix = "com";
+    
+        String jvmArg = "-XX:+DisableAttachMechanism,-Xms1024M";
+        
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.5.0.jar"
+                + " originJarOrWar=" + originJarOrWar
+                + " includePrefix=" + includePrefix
+                + " jvmArgCheck=" + jvmArg
+                + " debug=true"
+                ;
+        // 加密
+        BashUtil.runBashAndPrint(startBat);
+    
+    
+        String encryptedJar = originJarOrWar.replace(".jar", "-encrypted.jar");
+    
+        // 解密
+        String javaagentArgs = "";
+        // String javaagentArgs = "=debug=true";
+        // String javaagentArgs = "=debug=true,password=xxx";
+        BashUtil.runBashAndPrint(String.format("java -javaagent:%s%s=debug=true -XX:+DisableAttachMechanism -Xms1024m -jar %s", encryptedJar, javaagentArgs, encryptedJar));
+    }
+    
+    /**
+     * jar测试 - 只指定指定一个
+     */
+    public static void jvmCheckJarOneTest() {
+        // 杀下进程(以保证端口没有被占用)
+        BashUtil.killProcessByPorts("8080");
+        
+        String projectRootDir = PathUtil.getProjectRootDir(AlreadyProtectedLibs_Test.class);
+        String originJarOrWar = projectRootDir + "boot-jar.jar";
+        String includePrefix = "com";
+    
+        String jvmArg = "-XX:+DisableAttachMechanism";
+        
+        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.5.0.jar"
+                + " originJarOrWar=" + originJarOrWar
+                + " includePrefix=" + includePrefix
+                + " jvmArgCheck=" + jvmArg
+                + " debug=true"
+                ;
+        // 加密
+        BashUtil.runBashAndPrint(startBat);
+    
+    
+        String encryptedJar = originJarOrWar.replace(".jar", "-encrypted.jar");
+    
+        // 解密
+        String javaagentArgs = "";
+        // String javaagentArgs = "=debug=true";
+        // String javaagentArgs = "=debug=true,password=xxx";
+        BashUtil.runBashAndPrint(String.format("java -javaagent:%s%s=debug=true -XX:+DisableAttachMechanism -jar %s", encryptedJar, javaagentArgs, encryptedJar));
+    }
+}

+ 0 - 52
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/JvmStartCheck_Test.java

@@ -1,52 +0,0 @@
-package winter.com.ideaaedi.classwinter;
-
-import winter.com.ideaaedi.classwinter.author.JustryDeng;
-import winter.com.ideaaedi.classwinter.util.BashUtil;
-import winter.com.ideaaedi.classwinter.util.PathUtil;
-
-/**
- * 测试jvmStartCheck
- * <p>
- *     jvmStartCheck: 在启动混淆包时,检查是否输入有(在加密时)指定的jvm参数
- * </p>
- * @author {@link JustryDeng}
- * @since 2021/6/12 14:34:45
- */
-public class JvmStartCheck_Test {
-    
-    public static void main(String[] args) {
-        jvmCheckJarTest();
-    }
-    
-    /**
-     * jar测试
-     */
-    public static void jvmCheckJarTest() {
-        // 杀下进程(以保证端口没有被占用)
-        BashUtil.killProcessByPorts("8080");
-        
-        String projectRootDir = PathUtil.getProjectRootDir(AlreadyProtectedLibs_Test.class);
-        String originJarOrWar = projectRootDir + "boot-jar.jar";
-        String includePrefix = "com";
-    
-        String jvmArg = "-XX:+DisableAttachMechanism,-Xms1024M";
-        
-        String startBat = "java -jar " + projectRootDir + "class-winter-core-2.5.0.jar"
-                + " originJarOrWar=" + originJarOrWar
-                + " includePrefix=" + includePrefix
-                + " jvmStartCheck=" + jvmArg
-                + " debug=true"
-                ;
-        // 加密
-        BashUtil.runBashAndPrint(startBat);
-    
-    
-        String encryptedJar = originJarOrWar.replace(".jar", "-encrypted.jar");
-    
-        // 解密
-        String javaagentArgs = "";
-        // String javaagentArgs = "=debug=true";
-        // String javaagentArgs = "=debug=true,password=xxx";
-        BashUtil.runBashAndPrint(String.format("java -javaagent:%s%s=debug=true -XX:+DisableAttachMechanism -Xms1022M -jar %s", encryptedJar, javaagentArgs, encryptedJar));
-    }
-}

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


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

@@ -60,7 +60,7 @@ public class ClassWinterPlugin extends AbstractMojo {
     private String supportFile;
     
     @Parameter
-    private String jvmStartCheck;;
+    private String jvmArgCheck;;
     
     @Parameter
     private String tips;
@@ -85,7 +85,7 @@ public class ClassWinterPlugin extends AbstractMojo {
         Logger.debug("You config arg includeLibs -> " + includeLibs);
         Logger.debug("You config arg alreadyProtectedLibs -> " + alreadyProtectedLibs);
         Logger.debug("You config arg supportFile -> " + supportFile);
-        Logger.debug("You config arg jvmStartCheck -> " + jvmStartCheck);
+        Logger.debug("You config arg jvmArgCheck -> " + jvmArgCheck);
         Logger.debug("You config arg tips -> " + tips);
         Logger.debug("You config arg debug -> " + debug);
         
@@ -105,7 +105,7 @@ public class ClassWinterPlugin extends AbstractMojo {
                 .includeLibs(includeLibs)
                 .alreadyProtectedLibs(alreadyProtectedLibs)
                 .supportFile(supportFile)
-                .jvmStartCheck(jvmStartCheck)
+                .jvmArgCheck(jvmArgCheck)
                 .debug(debug)
                 .tips(tips)
                 .build();