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

简介: 经过研究发现。google 的限制jar 是   appengine-tools-api    修改类:   com.google.appengine.tools.development.DevAppServerFactory   就可以再本地环境适应 hibernate 连接数据库。创建线程,创建文件等操作。(当然你改的是本地环境。google服务器上的是没有办法了。)  

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

 

 

目录
相关文章
|
7天前
|
API 数据安全/隐私保护 UED
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
在掌握了鸿蒙系统的开发基础后,我挑战了蓝牙功能的开发。通过Bluetooth A2DP和Access API,实现了蓝牙音频流传输、设备连接和权限管理。具体步骤包括:理解API作用、配置环境与权限、扫描并连接设备、实现音频流控制及动态切换设备。最终,我构建了一个简单的蓝牙音频播放器,具备设备扫描、连接、音频播放与停止、切换输出设备等功能。这次开发让我对蓝牙技术有了更深的理解,也为未来的复杂项目打下了坚实的基础。
93 58
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
|
6天前
|
存储 API 计算机视觉
自学记录HarmonyOS Next Image API 13:图像处理与传输的开发实践
在完成数字版权管理(DRM)项目后,我决定挑战HarmonyOS Next的图像处理功能,学习Image API和SendableImage API。这两个API支持图像加载、编辑、存储及跨设备发送共享。我计划开发一个简单的图像编辑与发送工具,实现图像裁剪、缩放及跨设备共享功能。通过研究,我深刻体会到HarmonyOS的强大设计,未来这些功能可应用于照片编辑、媒体共享等场景。如果你对图像处理感兴趣,不妨一起探索更多高级特性,共同进步。
60 11
|
3天前
|
JSON API 开发者
Lazada 商品评论列表 API 接口:开发、应用与收益
Lazada作为东南亚领先的电商平台,其商品评论数据蕴含丰富信息。通过开发和利用Lazada商品评论列表API接口,企业可深入挖掘这些数据,优化产品、营销和服务,提升客户体验和市场竞争力。该API基于HTTP协议,支持GET、POST等方法,开发者需注册获取API密钥,并选择合适的编程语言(如Python)进行开发。应用场景包括竞品分析、客户反馈处理及精准营销,帮助企业提升销售业绩、降低运营成本并增强品牌声誉。
16 2
|
7天前
|
供应链 搜索推荐 API
1688榜单商品详细信息API接口的开发、应用与收益
1688作为全球知名的B2B电商平台,为企业提供丰富的商品信息和交易机会。为满足企业对数据的需求,1688开发了榜单商品详细信息API接口,帮助企业批量获取商品详情,应用于信息采集、校验、同步与数据分析等领域,提升运营效率、优化库存管理、精准推荐、制定市场策略、降低采购成本并提高客户满意度。该接口通过HTTP请求调用,支持多种应用场景,助力企业在电商领域实现可持续发展。
45 4
|
6天前
|
监控 搜索推荐 API
京东按图搜索京东商品(拍立淘)API接口的开发、应用与收益
京东通过开放商品详情API接口,尤其是按图搜索(拍立淘)API,为开发者、企业和商家提供了创新空间和数据支持。该API基于图像识别技术,允许用户上传图片搜索相似商品,提升购物体验和平台竞争力。开发流程包括注册账号、获取密钥、准备图片、调用API并解析结果。应用场景涵盖电商平台优化、竞品分析、个性化推荐等,为企业带来显著收益,如增加销售额、提高利润空间和优化用户体验。未来,随着数字化转型的深入,该API的应用前景将更加广阔。
41 1
|
14天前
|
监控 供应链 搜索推荐
阿里妈妈商品详情API接口:开发、应用与收益的深度剖析
阿里妈妈是阿里巴巴旗下的数字营销平台,其商品详情API接口为开发者提供了获取淘宝、天猫等电商平台商品详细信息的工具。本文介绍了该接口的开发流程、应用场景及带来的收益,揭示了其在电商生态中的重要地位。
76 6
|
14天前
|
供应链 搜索推荐 API
1688APP原数据API接口的开发、应用与收益(一篇文章全明白)
1688作为全球知名的B2B电商平台,通过开放的原数据API接口,为开发者提供了丰富的数据资源,涵盖商品信息、交易数据、店铺信息、物流信息和用户信息等。本文将深入探讨1688 APP原数据API接口的开发、应用及其带来的商业收益,包括提升流量、优化库存管理、增强用户体验等方面。
74 6
|
16天前
|
监控 搜索推荐 API
京东商品详情API接口的开发、应用与收益探索
在数字化和互联网高速发展的时代,京东通过开放商品详情API接口,为开发者、企业和商家提供了丰富的数据源和创新空间。本文将探讨该API接口的开发背景、流程、应用场景及带来的多重收益,包括促进生态系统建设、提升数据利用效率和推动数字化转型等。
59 3
|
21天前
|
供应链 搜索推荐 API
探索1688榜单商品详细信息API接口:开发、应用与收益
本文深入探讨了1688榜单商品详细信息API接口的开发与应用,涵盖接口概述、开发条件、调用方法及数据处理等内容。该API帮助企业高效获取1688平台商品信息,应用于商品信息采集、校验、同步与数据分析等领域,有效提升了企业的运营效率、库存管理、销售转化率及市场策略制定能力,降低了采购成本,提升了客户满意度。
38 9
|
24天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
56 10