经过研究发现。google 的限制jar 是
appengine-tools-api
修改类:
com.google.appengine.tools.development.DevAppServerFactory
就可以再本地环境适应 hibernate 连接数据库。创建线程,创建文件等操作。(当然你改的是本地环境。google服务器上的是没有办法了。)
这样做主要是为了开发 gwt 应用的。
修改类如下:
/*jadclipse*/// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
package com.google.appengine.tools.development;
import com.google.apphosting.utils.security.SecurityManagerInstaller;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.security.Permission;
import java.security.Permissions;
import java.util.*;
// Referenced classes of package com.google.appengine.tools.development:
// DevAppServerClassLoader, DevAppServer, AppContext
public class DevAppServerFactory {
private static class CustomSecurityManager extends SecurityManager {
private synchronized boolean appHasPermission(Permission perm) {
return true;
/** 直接返回 */
}
public void checkPermission(Permission perm) {
return;
/** 直接返回 */
}
public void checkPermission(Permission perm, Object context) {
return;
/** 直接返回 */
}
public void checkAccess(ThreadGroup g) {
return;
/** 直接返回 */
}
public void checkAccess(Thread t) {
return;
/** 直接返回 */
}
public boolean isDevAppServerThread() {
return true;
/** 直接返回 */
}
private StackTraceElement getCallerFrame() {
StackTraceElement frames[] = Thread.currentThread().getStackTrace();
for (int i = 1; i < frames.length; i++)
if (!"checkAccess".equals(frames[i].getMethodName())
&& !getClass().getName().equals(
frames[i].getClassName()))
return frames[i];
throw new IllegalStateException(
"Unable to determine calling frame.");
}
private static final RuntimePermission PERMISSION_MODIFY_THREAD_GROUP = new RuntimePermission(
"modifyThreadGroup");
private static final RuntimePermission PERMISSION_MODIFY_THREAD = new RuntimePermission(
"modifyThread");
private static final String KEYCHAIN_JNILIB = "/libkeychain.jnilib";
private static final Object PERMISSION_LOCK = new Object();
private final DevAppServer devAppServer;
public CustomSecurityManager(DevAppServer devAppServer) {
this.devAppServer = devAppServer;
}
}
public DevAppServerFactory() {
}
public DevAppServer createDevAppServer(File appDir, String address, int port) {
return createDevAppServer(appDir, null, null, address, port, true);
}
private DevAppServer createDevAppServer(File appDir, File webXmlLocation,
File appEngineWebXmlLocation, String address, int port,
boolean useCustomStreamHandler) {
return createDevAppServer(appDir, webXmlLocation,
appEngineWebXmlLocation, address, port, useCustomStreamHandler,
true, ((Map) (new HashMap())));
}
public DevAppServer createDevAppServer(File appDir, File webXmlLocation,
File appEngineWebXmlLocation, String address, int port,
boolean useCustomStreamHandler, boolean installSecurityManager,
Collection classpath) {
Map containerConfigProps = newContainerConfigPropertiesForTest(classpath);
return createDevAppServer(appDir, webXmlLocation,
appEngineWebXmlLocation, address, port, useCustomStreamHandler,
installSecurityManager, containerConfigProps);
}
private Map newContainerConfigPropertiesForTest(Collection classpath) {
Map containerConfigProps = new HashMap();
Map userCodeClasspathManagerProps = new HashMap();
userCodeClasspathManagerProps.put(
"devappserver.userCodeClasspathManager.classpath", classpath);
userCodeClasspathManagerProps.put(
"devappserver.userCodeClasspathManager.requiresWebInf",
Boolean.valueOf(false));
containerConfigProps.put("devappserver.userCodeClasspathManager",
userCodeClasspathManagerProps);
return containerConfigProps;
}
private DevAppServer createDevAppServer(File appDir, File webXmlLocation,
File appEngineWebXmlLocation, String address, int port,
boolean useCustomStreamHandler, boolean installSecurityManager,
Map containerConfigProperties) {
if (installSecurityManager)
SecurityManagerInstaller.install(new URL[0]);
DevAppServerClassLoader loader = DevAppServerClassLoader
.newClassLoader(com.google.appengine.tools.development.DevAppServerFactory.class
.getClassLoader());
testAgentIsInstalled();
DevAppServer devAppServer;
try {
Class devAppServerClass = Class.forName(
"com.google.appengine.tools.development.DevAppServerImpl",
true, loader);
Constructor cons = devAppServerClass
.getConstructor(DEV_APPSERVER_CTOR_ARG_TYPES);
cons.setAccessible(true);
devAppServer = (DevAppServer) cons.newInstance(new Object[] {
appDir, webXmlLocation, appEngineWebXmlLocation, address,
Integer.valueOf(port),
Boolean.valueOf(useCustomStreamHandler),
containerConfigProperties });
} catch (Exception e) {
Throwable t = e;
if (e instanceof InvocationTargetException)
t = e.getCause();
throw new RuntimeException("Unable to create a DevAppServer", t);
}
if (installSecurityManager)
System.setSecurityManager(new CustomSecurityManager(devAppServer));
return devAppServer;
}
private void testAgentIsInstalled() {
try {
// AppEngineDevAgent.getAgent();
} catch (Throwable t) {
String msg = "Unable to locate the App Engine agent. Please use dev_appserver, KickStart, or set the jvm flag: \"-javaagent:<sdk_root>/lib/agent/appengine-agent.jar\"";
throw new RuntimeException(msg, t);
}
}
static final String DEV_APP_SERVER_CLASS = "com.google.appengine.tools.development.DevAppServerImpl";
private static final Class DEV_APPSERVER_CTOR_ARG_TYPES[];
private static final String USER_CODE_CLASSPATH_MANAGER_PROP = "devappserver.userCodeClasspathManager";
private static final String USER_CODE_CLASSPATH = "devappserver.userCodeClasspathManager.classpath";
private static final String USER_CODE_REQUIRES_WEB_INF = "devappserver.userCodeClasspathManager.requiresWebInf";
static {
DEV_APPSERVER_CTOR_ARG_TYPES = (new Class[] { java.io.File.class,
java.io.File.class, java.io.File.class, java.lang.String.class,
Integer.TYPE, Boolean.TYPE, java.util.Map.class });
}
}
/*
* DECOMPILATION REPORT
*
* Decompiled from:
* D:\soft\eclipse_3.7.2\plugins\com.google.appengine.eclipse.sdkbundle_1
* .6.4.v201203300216r37\appengine-java-sdk-1.6.4\lib\appengine-tools-api.jar
* Total time: 174 ms Jad reported messages/errors: Overlapped try statements
* detected. Not all exception handlers will be resolved in the method
* appHasPermission Couldn't fully decompile method appHasPermission Couldn't
* resolve all exception handlers in method appHasPermission Exit status: 0
* Caught exceptions:
*/
附件是 appengine-java-sdk-1.6.4\lib\appengine-tools-api.jar 的jar包。替换就可以了。
jar 文件大于 10 MB 所以压缩了下。解压缩再替换。