防止jar被反编译 & 不安装jdk运行jar

防止jar被反编译

1.pom.xml


    
        jitpack
        https://jitpack.io
    



      
        org.openjfx
        javafx-controls
        11
    
    
        org.kordamp.bootstrapfx
        bootstrapfx-core
        0.2.4
    
    
        com.github.core-lib
        xjar
        2.1.1
    
    
        org.apache.commons
        commons-compress
        1.19
    
    
        com.github.core-lib
        loadkit
        v1.0.1
    



    com.zenjava
    javafx-maven-plugin
    8.8.3
    
        xiaoying
        com.ying.demo.Mm #注意修改代码路径
    

2.加密启动类

import io.xjar.XKit;
import io.xjar.boot.XBoot;
import io.xjar.key.XKey;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

import java.io.File;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;

public class Mm extends Application {
    public void start(Stage primaryStage) throws Exception {
        FlowPane pane = new FlowPane();
        pane.setPadding(new Insets(11, 500, 13, 14));
        pane.setHgap(5);
        pane.setVgap(5);

        Label lab1 = new Label("指定加密前jar包路径(例如:D:\\work\\target\\demo-0.0.1-SNAPSHOT.jar)");
        Label lab2 = new Label("指定加密密码");
        /*Label lab3 = new Label("指定需要加密的资源(例如:com/ying/**)");*/
        Label lab4 = new Label("加密后JAR包输出路径(例如:D:\\work\\target\\demo.jar)");

        TextField text1 = new TextField();
        text1.setPrefWidth(320);
        TextField text2 = new TextField();
        /*TextField text3 = new TextField();
        text3.setPrefWidth(320);*/
        TextField text4 = new TextField();
        text4.setPrefWidth(320);
        TextArea mess = new TextArea();
        mess.setPrefWidth(400);
        mess.setPrefHeight(120);

        Button button = new Button("加密");

        button.setOnAction(e -> {
            String value1 = text1.getText();
            String value2 = text2.getText();
            /*String value3 = text3.getText();*/
            String value4 = text4.getText();
            Alert alert = new Alert(Alert.AlertType.WARNING);
            Alert alertError = new Alert(Alert.AlertType.ERROR);
            Alert alertOk = new Alert(Alert.AlertType.INFORMATION);
            if (value1 == null || value1.trim().isEmpty()) {
                alert.setContentText("指定加密的jar包路径输入有误");
                alert.showAndWait();
                return;
            }
            if (value2 == null || value2.trim().isEmpty()) {
                alert.setContentText("指定加密密码输入有误");
                alert.showAndWait();
                return;
            }
            /*if(value3 == null || value3.trim().isEmpty()){
                alert.setContentText("指定需要加密的资源输入有误");
                alert.showAndWait();
                return;
            }*/
            if (value4 == null || value4.trim().isEmpty()) {
                alert.setContentText("指定加密后JAR包输出路径输入有误");
                alert.showAndWait();
                return;
            }
            try {
                XKey xKey = XKit.key(value2);
                XBoot.encrypt(value1, value4, xKey);
            } catch (Exception ex) {
                ex.printStackTrace();
                alertError.setContentText(ex.getMessage());
                alertError.showAndWait();
                return;
            }
            String path = value4.substring(0, value4.lastIndexOf("\\") == -1 ? 0 : value4.lastIndexOf("\\") + 1) + "password.key";
            File file = new File(path);
            //判断文件是否存在
            try {
                if (file.createNewFile()) {
                    //创建一个用于操作文件的字节输出流对象,创建就必须明确数据存储目的地
                    FileOutputStream fos = new FileOutputStream(file);
                    //写入
                    fos.write(("password: " + value2).getBytes(StandardCharsets.UTF_8));
                    //刷新并关闭流
                    fos.flush();
                    fos.close();
                }
            } catch (Exception eio) {
                eio.printStackTrace();
                alertError.setContentText(eio.getMessage());
                alertError.showAndWait();
                return;
            }

            String jar = value4.substring(value4.lastIndexOf("\\") == -1 ? 0 : value4.lastIndexOf("\\") + 1);
            String mes = "(1)命令行启动,输入密码\n" +
                    "java -jar " + jar + " \n" +
                    "(2)传参启动\n" +
                    "java -jar " + jar + " --xjar.password=" + value2 + "\n" +
                    "(3)后台启动\n" +
                    "nohup java -jar " + jar + " --xjar.keyfile=password.key";
            alertOk.setContentText("加密成功\n");
            alertOk.showAndWait();
            mess.setText(mes);

        });
        pane.getChildren().addAll(lab1, text1, lab2, text2, lab4, text4, button, mess);
        Scene scene = new Scene(pane, 480, 480);
        primaryStage.setTitle("encrypt-v1.0");
        primaryStage.setScene(scene);
        primaryStage.sizeToScene();
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

3.运行加密类

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

防止jar被反编译 & 不安装jdk运行jar_第1张图片

尝试反编译

防止jar被反编译 & 不安装jdk运行jar_第2张图片
防止jar被反编译 & 不安装jdk运行jar_第3张图片

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

防止jar被反编译 & 不安装jdk运行jar_第4张图片

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

防止jar被反编译 & 不安装jdk运行jar_第5张图片

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

bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre
防止jar被反编译 & 不安装jdk运行jar_第6张图片

2.创建start.bat文件

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

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

stop.bat:停止项目的脚本

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

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

防止jar被反编译 & 不安装jdk运行jar_第7张图片

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

收工!

你可能感兴趣的:(小功能,java,jar,maven)