feat: support scriptEngineJar packer

This commit is contained in:
ReaJason
2025-11-20 00:36:25 +08:00
parent 5e8529a0c7
commit 59fd17355b
25 changed files with 389 additions and 82 deletions
@@ -1,7 +1,4 @@
package com.reajason.javaweb.packer.jar;
import com.reajason.javaweb.packer.JarPackerConfig;
import com.reajason.javaweb.packer.Packer;
package com.reajason.javaweb.packer;
/**
* @author ReaJason
@@ -19,10 +19,7 @@ import com.reajason.javaweb.packer.groovy.GroovyScriptEnginePacker;
import com.reajason.javaweb.packer.h2.H2JSPacker;
import com.reajason.javaweb.packer.h2.H2JavacPacker;
import com.reajason.javaweb.packer.h2.H2Packer;
import com.reajason.javaweb.packer.jar.AgentJarPacker;
import com.reajason.javaweb.packer.jar.AgentJarWithJDKAttacherPacker;
import com.reajason.javaweb.packer.jar.AgentJarWithJREAttacherPacker;
import com.reajason.javaweb.packer.jar.DefaultJarPacker;
import com.reajason.javaweb.packer.jar.*;
import com.reajason.javaweb.packer.jexl.JEXLPacker;
import com.reajason.javaweb.packer.jinjava.JinJavaPacker;
import com.reajason.javaweb.packer.jsp.ClassLoaderJspPacker;
@@ -72,7 +69,13 @@ public enum Packers {
Base64URLEncoded(new Base64URLEncoded(), Base64Packer.class),
GzipBase64(new GzipBase64Packer(), Base64Packer.class),
Jar(new DefaultJarPacker()),
/**
* JSP 打包器
*/
JSP(new JspPacker()),
ClassLoaderJSP(new ClassLoaderJspPacker(), JspPacker.class),
DefineClassJSP(new DefineClassJspPacker(), JspPacker.class),
JSPX(new JspxPacker(), JspPacker.class),
/**
* BigInteger
@@ -84,14 +87,6 @@ public enum Packers {
*/
BCEL(new BCELPacker()),
/**
* JSP 打包器
*/
JSP(new JspPacker()),
ClassLoaderJSP(new ClassLoaderJspPacker(), JspPacker.class),
DefineClassJSP(new DefineClassJspPacker(), JspPacker.class),
JSPX(new JspxPacker(), JspPacker.class),
/**
* 脚本引擎打包器
*/
@@ -168,6 +163,9 @@ public enum Packers {
H2Javac(new H2JavacPacker(), H2Packer.class),
H2JS(new H2JSPacker(), H2Packer.class),
Jar(new DefaultJarPacker()),
ScriptEngineJar(new ScriptEngineJarPacker()),
XxlJob(new XxlJobPacker()),
;
private final Packer instance;
@@ -2,6 +2,7 @@ package com.reajason.javaweb.packer.jar;
import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.asm.ClassRenameUtils;
import com.reajason.javaweb.packer.JarPacker;
import com.reajason.javaweb.packer.JarPackerConfig;
import lombok.SneakyThrows;
import org.apache.commons.io.IOUtils;
@@ -2,6 +2,7 @@ package com.reajason.javaweb.packer.jar;
import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.asm.ClassRenameUtils;
import com.reajason.javaweb.packer.JarPacker;
import com.reajason.javaweb.packer.JarPackerConfig;
import com.reajason.javaweb.packer.jar.attach.Attacher;
import com.reajason.javaweb.packer.jar.attach.VirtualMachine;
@@ -2,6 +2,7 @@ package com.reajason.javaweb.packer.jar;
import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.asm.ClassRenameUtils;
import com.reajason.javaweb.packer.JarPacker;
import com.reajason.javaweb.packer.JarPackerConfig;
import com.reajason.javaweb.packer.jar.attach.Attacher;
import com.reajason.javaweb.packer.jar.attach.VirtualMachine;
@@ -1,5 +1,6 @@
package com.reajason.javaweb.packer.jar;
import com.reajason.javaweb.packer.JarPacker;
import com.reajason.javaweb.packer.JarPackerConfig;
import lombok.SneakyThrows;
@@ -0,0 +1,38 @@
package com.reajason.javaweb.packer.jar;
import com.reajason.javaweb.asm.ClassInterfaceUtils;
import com.reajason.javaweb.packer.JarPacker;
import com.reajason.javaweb.packer.JarPackerConfig;
import lombok.SneakyThrows;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
/**
* @author ReaJason
* @since 2025/11/16
*/
public class ScriptEngineJarPacker implements JarPacker {
@Override
@SneakyThrows
public byte[] packBytes(JarPackerConfig config) {
String mainClassName = config.getMainClassName();
byte[] mainClassBytes = config.getClassBytes().get(mainClassName);
byte[] bytes = ClassInterfaceUtils.addInterface(mainClassBytes, "javax.script.ScriptEngineFactory");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try (JarOutputStream targetJar = new JarOutputStream(outputStream, new Manifest())) {
targetJar.putNextEntry(new JarEntry(mainClassName.replace('.', '/') + ".class"));
targetJar.write(bytes);
targetJar.closeEntry();
targetJar.putNextEntry(new JarEntry("META-INF/services/javax.script.ScriptEngineFactory"));
targetJar.write(mainClassName.getBytes(StandardCharsets.UTF_8));
targetJar.closeEntry();
}
return outputStream.toByteArray();
}
}