当前位置:   article > 正文

防止jar被反编译 & 不安装jdk运行jar_jar包如何防止反编译

jar包如何防止反编译

防止jar被反编译

1.pom.xml

  1. <repositories>
  2. <repository>
  3. <id>jitpack</id>
  4. <url>https://jitpack.io</url>
  5. </repository>
  6. </repositories>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.openjfx</groupId>
  10. <artifactId>javafx-controls</artifactId>
  11. <version>11</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.kordamp.bootstrapfx</groupId>
  15. <artifactId>bootstrapfx-core</artifactId>
  16. <version>0.2.4</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>com.github.core-lib</groupId>
  20. <artifactId>xjar</artifactId>
  21. <version>2.1.1</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.apache.commons</groupId>
  25. <artifactId>commons-compress</artifactId>
  26. <version>1.19</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>com.github.core-lib</groupId>
  30. <artifactId>loadkit</artifactId>
  31. <version>v1.0.1</version>
  32. </dependency>
  33. </dependencies>
  34. <plugin>
  35. <groupId>com.zenjava</groupId>
  36. <artifactId>javafx-maven-plugin</artifactId>
  37. <version>8.8.3</version>
  38. <configuration>
  39. <vendor>xiaoying</vendor>
  40. <mainClass>com.ying.demo.Mm</mainClass> #注意修改代码路径
  41. </configuration>
  42. </plugin>

2.加密启动类

  1. import io.xjar.XKit;
  2. import io.xjar.boot.XBoot;
  3. import io.xjar.key.XKey;
  4. import javafx.application.Application;
  5. import javafx.geometry.Insets;
  6. import javafx.scene.Scene;
  7. import javafx.scene.control.*;
  8. import javafx.scene.layout.FlowPane;
  9. import javafx.stage.Stage;
  10. import java.io.File;
  11. import java.io.FileOutputStream;
  12. import java.nio.charset.StandardCharsets;
  13. public class Mm extends Application {
  14. public void start(Stage primaryStage) throws Exception {
  15. FlowPane pane = new FlowPane();
  16. pane.setPadding(new Insets(11, 500, 13, 14));
  17. pane.setHgap(5);
  18. pane.setVgap(5);
  19. Label lab1 = new Label("指定加密前jar包路径(例如:D:\\work\\target\\demo-0.0.1-SNAPSHOT.jar)");
  20. Label lab2 = new Label("指定加密密码");
  21. /*Label lab3 = new Label("指定需要加密的资源(例如:com/ying/**)");*/
  22. Label lab4 = new Label("加密后JAR包输出路径(例如:D:\\work\\target\\demo.jar)");
  23. TextField text1 = new TextField();
  24. text1.setPrefWidth(320);
  25. TextField text2 = new TextField();
  26. /*TextField text3 = new TextField();
  27. text3.setPrefWidth(320);*/
  28. TextField text4 = new TextField();
  29. text4.setPrefWidth(320);
  30. TextArea mess = new TextArea();
  31. mess.setPrefWidth(400);
  32. mess.setPrefHeight(120);
  33. Button button = new Button("加密");
  34. button.setOnAction(e -> {
  35. String value1 = text1.getText();
  36. String value2 = text2.getText();
  37. /*String value3 = text3.getText();*/
  38. String value4 = text4.getText();
  39. Alert alert = new Alert(Alert.AlertType.WARNING);
  40. Alert alertError = new Alert(Alert.AlertType.ERROR);
  41. Alert alertOk = new Alert(Alert.AlertType.INFORMATION);
  42. if (value1 == null || value1.trim().isEmpty()) {
  43. alert.setContentText("指定加密的jar包路径输入有误");
  44. alert.showAndWait();
  45. return;
  46. }
  47. if (value2 == null || value2.trim().isEmpty()) {
  48. alert.setContentText("指定加密密码输入有误");
  49. alert.showAndWait();
  50. return;
  51. }
  52. /*if(value3 == null || value3.trim().isEmpty()){
  53. alert.setContentText("指定需要加密的资源输入有误");
  54. alert.showAndWait();
  55. return;
  56. }*/
  57. if (value4 == null || value4.trim().isEmpty()) {
  58. alert.setContentText("指定加密后JAR包输出路径输入有误");
  59. alert.showAndWait();
  60. return;
  61. }
  62. try {
  63. XKey xKey = XKit.key(value2);
  64. XBoot.encrypt(value1, value4, xKey);
  65. } catch (Exception ex) {
  66. ex.printStackTrace();
  67. alertError.setContentText(ex.getMessage());
  68. alertError.showAndWait();
  69. return;
  70. }
  71. String path = value4.substring(0, value4.lastIndexOf("\\") == -1 ? 0 : value4.lastIndexOf("\\") + 1) + "password.key";
  72. File file = new File(path);
  73. //判断文件是否存在
  74. try {
  75. if (file.createNewFile()) {
  76. //创建一个用于操作文件的字节输出流对象,创建就必须明确数据存储目的地
  77. FileOutputStream fos = new FileOutputStream(file);
  78. //写入
  79. fos.write(("password: " + value2).getBytes(StandardCharsets.UTF_8));
  80. //刷新并关闭流
  81. fos.flush();
  82. fos.close();
  83. }
  84. } catch (Exception eio) {
  85. eio.printStackTrace();
  86. alertError.setContentText(eio.getMessage());
  87. alertError.showAndWait();
  88. return;
  89. }
  90. String jar = value4.substring(value4.lastIndexOf("\\") == -1 ? 0 : value4.lastIndexOf("\\") + 1);
  91. String mes = "(1)命令行启动,输入密码\n" +
  92. "java -jar " + jar + " \n" +
  93. "(2)传参启动\n" +
  94. "java -jar " + jar + " --xjar.password=" + value2 + "\n" +
  95. "(3)后台启动\n" +
  96. "nohup java -jar " + jar + " --xjar.keyfile=password.key";
  97. alertOk.setContentText("加密成功\n");
  98. alertOk.showAndWait();
  99. mess.setText(mes);
  100. });
  101. pane.getChildren().addAll(lab1, text1, lab2, text2, lab4, text4, button, mess);
  102. Scene scene = new Scene(pane, 480, 480);
  103. primaryStage.setTitle("encrypt-v1.0");
  104. primaryStage.setScene(scene);
  105. primaryStage.sizeToScene();
  106. primaryStage.show();
  107. }
  108. public static void main(String[] args) {
  109. launch();
  110. }
  111. }

3.运行加密类

填写需要加密的jar路径,和加密后存放jar的路径

尝试反编译

4.启动项目

(1)命令行启动,输入密码:java -jar demo.jar

(2)传参启动:java -jar demo.jar --xjar.password=123

(3)后台启动:nohup java -jar demo.jar --xjar.keyfile=password.key


不安装jdk运行jar

前言:有一种需求,客户不买服务器,要你运行在他的win系统上,然后又不会装JDK,客户又多,作为一名合格的开发又不能闲着没屁事,天天给客户装JDK,所有就有了这篇文章(原理就是把jdk和项目打包一起给他,在写个bat脚本,让他双击直接启动项目)。

1.复制jdk下的jre

复制你电脑的jre

注:如果是jdk9以上版本没有jre,但是有jmods,需要自己手动生成,如下图所示

进入jdk所在目录下,通过命令手动生成jre文件

bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre

2.创建start.bat文件

  1. @echo off
  2. start /b ./jre/bin/java.exe -jar demo.jar --xjar.password=123
  3. cmd #这行可以删除,作用只是防止小黑窗口关闭

注:javaw.exe启动不会显示控制台内容,java.exe启动会显示控制台内容

stop.bat:停止项目的脚本

  1. @echo off
  2. set port=8080 #项目端口号
  3. for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do taskkill /pid %%m -t -f
  4. exit

3.把他们(jre、demo.jar、start.bat)放到同一个文件夹,一起给客户,客户只要双击start.bat就可以启动

4.双击start.bat即可运行项目成功

收工!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/548940
推荐阅读
相关标签
  

闽ICP备14008679号