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

防止jar被反编译

1.pom.xml

<repositories>
    <repository>
        <id>jitpack</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

<dependencies>
      <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.kordamp.bootstrapfx</groupId>
        <artifactId>bootstrapfx-core</artifactId>
        <version>0.2.4</version>
    </dependency>
    <dependency>
        <groupId>com.github.core-lib</groupId>
        <artifactId>xjar</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-compress</artifactId>
        <version>1.19</version>
    </dependency>
    <dependency>
        <groupId>com.github.core-lib</groupId>
        <artifactId>loadkit</artifactId>
        <version>v1.0.1</version>
    </dependency>
</dependencies>

<plugin>
    <groupId>com.zenjava</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>8.8.3</version>
    <configuration>
        <vendor>xiaoying</vendor>
        <mainClass>com.ying.demo.Mm</mainClass> #注意修改代码路径
    </configuration>
</plugin>

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的路径

尝试反编译

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文件

@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就可以启动

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

收工!

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值