本窗体程序基于开源项目xjar
https://gitee.com/core-lib/xjar/tree/2.1.1/src/main/java/io/xjar
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lingxiao</groupId>
<artifactId>m</artifactId>
<version>1.0</version>
<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>
<build>
<plugins>
<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>8.8.3</version>
<configuration>
<vendor>lingxiao</vendor>
<mainClass>com.lingxiao.Mm</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
其中xjar和loadkit我这里maven下载不下来可以自己找源码地址下载后编译打包到本地maven仓库
xjar地址:https://gitee.com/core-lib/xjar/tree/2.1.1/src/main/java/io/xjar
loadkit地址:https://gitee.com/core-lib/loadkit
package com.lingxiao;
import io.xjar.XKit;
import io.xjar.boot.XBoot;
import io.xjar.jar.XJarAntEntryFilter;
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.*;
import java.nio.charset.Charset;
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\\zike\\target\\zike.jar)");
Label lab2 = new Label("指定加密密码");
/*Label lab3 = new Label("指定需要加密的资源(例如:com/lingxiao/**)");*/
Label lab4 = new Label("加密后JAR包输出路径(例如:D:\\work\\zike\\target\\zikeMm.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("lingxiaoMm-v1.0");
primaryStage.setScene(scene);
primaryStage.sizeToScene();
primaryStage.show();
}
public static void main(String[] args) {
launch();
}
}
指定加密前jar包路径(例如:D:\work\zike\target\zike.jar)
指定加密密码
加密后JAR包输出路径(例如:D:\work\zike\target\zikeMm.jar)
(1)命令行启动,输入密码
java -jar zikeMm.jar
(2)传参启动
java -jar zikeMm.jar --xjar.password=123
(3)后台启动
nohup java -jar zikeMm.jar --xjar.keyfile=password.key
备注:
(1)输入启动密码错误无法启动
(2)加密后反编译失败
(3)可以直接打包为EXE程序
打包命令:
mvn jfx:native