GWT 项目开发 1.6.4 本地开发 appengine-tools-api 突破限制

经过研究发现。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 所以压缩了下。解压缩再替换。

 

 

时间: 2024-10-30 22:13:42

GWT 项目开发 1.6.4 本地开发 appengine-tools-api 突破限制的相关文章

Android native应用开发简明教程 (1) - 本地开发武器库概览

Android本地开发武器库概览 Android本地开发支持简史 Android 1.0的时代,没有提供对于C/C++开发本地Android代码的支持,尽管Android系统本身使用了大量的C++做底层开发. 第一个里程碑 - 支持jni开发so库 (Android 1.5) Android第一次支持本地开发是在Android 1.5版本,对应Android API level 3.这一版本,有了正式的Android NDK的支持,可以通过jni写so库的方式,供Android应用来调用. An

SharePoint 2013的本地开发解决方案及远程调试

在SharePoint开发中,我们需要在部署有SharePoint环境的服务器中开发,这是一件让人很苦恼的事情,毕竟不能一个项目多人开发配备多台服务器,这就需要本地开发. 本来自己以为SharePoint 2013在不再支持客户端系统的条件下,只能服务器上开发,QQ群里的朋友提醒说也可以本地开发,远程调试,以为自己是知道SharePoint 2010可以通过注册表修改,本地安装SharePoint的,顺着这个思路,经过一番谷歌/bing,然后实现了,在此总结一下,分享给大家. 思  路 本地安装

单元测试:在您的数据库项目中应用测试驱动的开发

本文讨论: TDD 的优点 在数据库开发中应用单元测试 组合 T-SQL 与 .NET 兼容的语言 连接.测试条件和事务 本文使用了以下技术: Visual Studio 2008, SQL Server LMicrosoft 于 2006 年 11 月发布了 Visual Studio Team System Database Edition,也称为 DBPro 或 Data Dude,它向产品生命周期方法中引入了数据库开发.DBPro 还引进了数据库单元测试设计 器,使用它可以轻松地生成或编

SharePoint 2013 本地开发解决方案以及远程调试

在SharePoint开发中,我们需要在部署有SharePoint环境的服务器中开发,这是一件让人很苦恼的事情,毕竟不能一个项目多人开发配备多台服务器,这就需要本地开发. 本来自己以为SharePoint 2013在不再支持客户端系统的条件下,只能服务器上开发,QQ群里的朋友提醒说也可以本地开发,远程调试,以为自己是知道SharePoint 2010可以通过注册表修改,本地安装SharePoint的,顺着这个思路,经过一番谷歌/bing,然后实现了,在此总结一下,分享给大家. 思  路 本地安装

用 Ubuntu 搭建一个 Ruby on Rails 本地开发环境

想要开发 Ruby on Rails 应用吗?虽然已经有一些(初级的)Ruby on Rails 教程了,但是似乎在如何搭建一个简洁而更新的本地开发环境方面还有些不甚确定的地方. 这个教程将引导你通过几个步骤来搭建一个基于 Ubuntu 的 Ruby on Rails 本地开发环境.而这个教程的即将发布的第二部分,将帮助你搭建一个 Ubuntu VPS.当前你暂时知道 VPS 是虚拟私有服务器的意思就可以了,让我们先将注意力转回到如何搭建本地开发环境中. Bf Frontpage in Set

【实例】Spark本地开发环境搭建

本文使用Scala2.10.6,sbt.请自行提前装好. 设置SSH,本地免密码登录 因为Spark master需要ssh到Spark worker中执行命令,所以,需要免密码登录. cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys  执行ssh localhost确认一下,如果不需要密码登录就说明OK了. Tips: Mac下可能ssh不到本地,请检查你sharing设置: 下载Spark http://spark.apache.org/downl

Node.js配合node-http-proxy解决本地开发ajax跨域问题_node.js

情景: 前后端分离,本地前端开发调用接口会有跨域问题,一般有以下3种解决方法: 1. 后端接口打包到本地运行(缺点:每次后端更新都要去测试服下一个更新包,还要在本地搭建java运行环境,麻烦) 2. CORS跨域:后端接口在返回的时候,在header中加入'Access-Control-Allow-origin':* 之类的(有的时候后端不方便这样处理,前端就蛋疼了) 3. 用nodejs搭建本地http服务器,并且判断访问接口URL时进行转发,完美解决本地开发时候的跨域问题.  用到的技术:

在 Mac/win7 下上使用 Vagrant 打造本地开发环境

1. vagrant介绍 1.1 vagrant能做什么 做Web开发(java/php/python/ruby...)少不了要在本地搭建好开发环境,虽然说目前各种脚本/语言都有对应的Windows版,甚至是一键安装包,但很多时候和Windows环境的兼容性(如配置文件.编译的模块)并不是那么好,麻烦的问题是实际部署的环境通常是Linux,常常还要面临着开发和部署环境不一致,上线前还要大量的调试.而如果让每个开发人员都自己去搭建本地环境,安装虚拟机.下载ISO镜像.选择规格安装创建vm.安装OS

如何将本地开发的系统迁移到云端,数据存储问题 求大神

问题描述 如果我在本地开发了一个系统,想把它迁移到云端,请问如何将关系数据库(例如:mysql)中的格式化数据用Hbase.Bigtable这样的非关系型数据库存储?求大神 解决方案 解决方案二:内容追加:非关系型数据库可以存储关系型数据库中的格式化数据么?解决方案三:有个工具sqoop,可以把mysql的数据导入到hbase中但是,hbase只是一个nosql数据库,不支持sql语句.事务等特性,所以用它来取代mysql,你还得掂量掂量解决方案四:mysql导入到hbase很容易,但要让你的系