Merge pull request #72 from MisakaMikato/fix-memshell-bug

修复在特定环境下JSEngine无法获取到defineClass的bug
This commit is contained in:
2025-06-14 09:09:09 +08:00
committed by GitHub
3 changed files with 2 additions and 151 deletions
-149
View File
@@ -1,149 +0,0 @@
plugins {
id 'java-library'
id 'maven-publish'
id 'com.gradleup.shadow' version '8.3.5'
id 'java'
}
repositories {
mavenCentral()
maven {
url = uri('https://repo.jenkins-ci.org/releases/')
}
maven {
url = uri('https://repo.maven.apache.org/maven2/')
}
}
shadowJar {
archiveClassifier.set('pre')
manifest {
attributes 'Main-Class': 'com.qi4l.JYso.Starter'
}
zip64=true
//minimize()
}
dependencies {
api libs.io.projectreactor.reactor.core
api libs.com.ibm.websphere.appserver.api.com.ibm.websphere.appserver.api.wsoc
api libs.org.glassfish.tyrus.tyrus.server
api libs.org.javassist.javassist
api libs.xerces.xercesimpl
api libs.com.fasterxml.jackson.core.jackson.databind
api libs.com.teradata.jdbc.terajdbc
api libs.jboss.jboss.serialization
api libs.org.apache.wicket.wicket.util
api libs.com.vaadin.vaadin.server
api libs.org.apache.myfaces.core.myfaces.impl
api libs.rhino.js
api libs.rome.rome
api libs.com.alibaba.fastjson
api libs.com.alibaba.fastjson2.fastjson2
api libs.org.jenkins.ci.main.remoting
api libs.org.jboss.weld.weld.core
api libs.org.jboss.remoting.jboss.remoting
api libs.org.jboss.remotingjmx.remoting.jmx
api libs.org.jboss.interceptor.jboss.interceptor.core
api libs.org.jboss.interceptor.jboss.interceptor.spi
api libs.org.python.jython.standalone
api libs.org.hibernate.hibernate.core
api libs.org.fusesource.jansi.jansi
api libs.commons.cli.commons.cli
api libs.org.apache.commons.commons.lang3
api libs.org.apache.logging.log4j.log4j.core
api libs.org.springframework.spring.core
api libs.org.springframework.spring.beans
api libs.org.springframework.spring.web
api libs.org.springframework.spring.oxm
api libs.org.springframework.spring.tx
api libs.org.springframework.spring.jdbc
api libs.org.springframework.spring.webmvc
api libs.org.springframework.spring.aop
api libs.org.springframework.spring.context.support
api libs.org.springframework.spring.test
api libs.javax.servlet.javax.servlet.api
api libs.com.mchange.c3p0
api libs.org.apache.tomcat.embed.tomcat.embed.core
api libs.org.ow2.asm.asm
api libs.com.unboundid.unboundid.ldapsdk
api libs.com.nqzero.permit.reflect
api libs.net.jodah.expiringmap
api libs.org.reflections.reflections
api libs.org.beanshell.bsh
api libs.io.undertow.undertow.core
api libs.io.undertow.undertow.servlet
api libs.org.jboss.spec.javax.security.jacc.jboss.jacc.api.v1.v4.spec
api libs.com.beust.jcommander
api libs.org.codehaus.groovy.groovy
api libs.org.apache.commons.commons.text
api libs.org.eclipse.jetty.jetty.ant
api libs.org.apache.maven.plugins.maven.assembly.plugin
api libs.org.apache.click.click.nodeps
api libs.org.clojure.clojure
api libs.cn.hutool.hutool.all
api libs.javax.websocket.javax.websocket.api
api libs.com.caucho.resin
implementation files('libs/jai-core-1.1.3.jar')
implementation files('libs/weblogic-server.jar')
constraints {
implementation('commons-collections:commons-collections') {
version {
strictly '3.2.1'
}
}
implementation('org.apache.commons:commons-collections4') {
version {
strictly '4.0'
}
}
}
implementation 'org.codehaus.castor:castor-xml:1.4.1'
implementation 'com.cedarsoftware:json-io:4.9.1'
implementation 'org.jyaml:jyaml:1.3'
implementation 'com.esotericsoftware:kryo:4.0.0'
implementation 'commons-configuration:commons-configuration:1.10'
implementation 'com.thoughtworks.xstream:xstream:1.4.9'
implementation 'org.apache.xbean:xbean-naming:4.5'
implementation 'com.rometools:rome:1.7.0'
implementation 'net.sf.json-lib:json-lib:2.4:jdk15'
implementation 'org.apache.directory.server:apacheds-xdbm-partition:2.0.0.AM26'
implementation 'commons-beanutils:commons-beanutils:1.9.4'
runtimeOnly libs.org.aspectj.aspectjweaver
compileOnly libs.org.apache.tomcat.tomcat.websocket
}
group = 'org.example'
version = '1.3.5.1'
description = 'JYso'
java.sourceCompatibility = JavaVersion.VERSION_1_8
publishing {
publications {
maven(MavenPublication) {
from(components.java)
}
}
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
tasks.withType(Javadoc) {
options.encoding = 'UTF-8'
}
compileJava {
options.compilerArgs << '-XDignore.symbol.file'
options.fork = true
options.forkOptions.executable = 'C:\\env\\JAVA\\corretto_jdk1.8.0_412\\bin\\javac.exe'
}
@@ -104,7 +104,7 @@ public class Utils {
if (USING_RHINO) {
return "new com.sun.org.apache.bcel.internal.util.ClassLoader().loadClass(\"" + generateBCELFormClassBytes(classBytes) + "\").newInstance();";
} else {
return "var data = \"" + base64Encode(classBytes) + "\";var dataBytes=java.util.Base64.getDecoder().decode(data);var cloader= java.lang.Thread.currentThread().getContextClassLoader();var superLoader=cloader.getClass().getSuperclass().getSuperclass().getSuperclass().getSuperclass();var method=superLoader.getDeclaredMethod(\"defineClass\",dataBytes.getClass(),java.lang.Integer.TYPE,java.lang.Integer.TYPE);method.setAccessible(true);var memClass=method.invoke(cloader,dataBytes,0,dataBytes.length);memClass.newInstance();";
return "var data = \"" + base64Encode(classBytes) + "\";var dataBytes=java.util.Base64.getDecoder().decode(data);var cl= java.lang.Thread.currentThread().getContextClassLoader();var clClass = cl.getClass();var defineClassMethod = null;while (clClass != null) {try {defineClassMethod = clClass.getDeclaredMethod(\"defineClass\", dataBytes.getClass(), java.lang.Integer.TYPE, java.lang.Integer.TYPE);defineClassMethod.setAccessible(true);break;} catch (e) {clClass = clClass.getSuperclass();}}if (defineClassMethod != null) {var memClass = defineClassMethod.invoke(cl, dataBytes, 0, dataBytes.length);memClass.newInstance();} else {throw \"Cannot find defineClass method.\";}";
}
}
@@ -59,7 +59,7 @@ public class TransformerUtil {
} else if (command.startsWith("EX-") || command.startsWith("LF-")) {
CtClass ctClass = generateClass(command);
if (!USING_MOZILLA_DEFININGCLASSLOADER) {
if (USING_MOZILLA_DEFININGCLASSLOADER) {
// 使用 DefiningClassLoader 加载,不是所有 JDK 均有 org.mozilla.javascript.DefiningClassLoader
// 在 NC 中可以使用
transformers = new Transformer[]{new ConstantTransformer(org.mozilla.javascript.DefiningClassLoader.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[0]}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[0]}), new InvokerTransformer("defineClass", new Class[]{String.class, byte[].class}, new Object[]{ctClass.getName(), ctClass.toBytecode()}), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new ConstantTransformer(1)};