1. 程式人生 > >GWT 專案開發 1.6.4 本地開發 appengine-tools-api 突破限制

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 所以壓縮了下。解壓縮再替換。

相關推薦

GWT 專案開發 1.6.4 本地開發 appengine-tools-api 突破限制

經過研究發現。google 的限制jar 是 appengine-tools-api  修改類: com.google.appengine.tools.development.DevAppServerFactory 就可以再本地環境適應 hibernate 連線資料庫

Vue-cli創建項目從單頁面到多頁面4 - 本地開發服務器設置代理

根目錄 control .com 目錄 pre 使用 exp class ble 前後端分離開發時,有時候會遇到跨域的情況:只在開發的時候存在跨域,項目上線後,由於配置的域名相同,跨域就會不存在。 這個時候,有兩種方案可以比較快的解決: 1、利用h5的特性,使用cors,在

Alios-Things之wifi模組二次開發-(1)搭建Alios-Things開發環境(基於ubuntu 16.0.4)

一、安裝流程如下:     1.先安裝VSCode,保證有個可視的編輯器;      2.然後安裝aos-cube,是編譯工具;      3.最後安裝git工具,下載Alios-Things國內託管倉庫程式

apache-cxf-3.1.6(webService介面開發maven)

1 結構圖 2 jar包 pom.xml    <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-core</artifactId><

智慧家居專案1):軟體開發流程

結合公司開發過的產品以及對自學知識的總結,整理出此係列文章  。側重點還是在軟體部分。 公司開發某個專案,肯定是為了盈利賺錢。開發的專案無非就是自己的產品或者承接甲方的開發任務。 大體的流程可以分為幾個部分或階段:                          

Appium 1.6.4 環境搭建流程(Java, Android+IOS, Windows+Mac)

經典 客戶 dev utf-8 4.6.1 新版本 -m works odi Appium1.6.4已經出來一段時間了,快速給大家串一下怎麽搭建,貼了下載鏈接 1 基礎環境: Windows + Mac: Java JDK 1.8+ (需配置環境變量),Appium1

6.1-6.4 gzip、Bzip2、xz

com was last 寫入內容 目標 ## 類型 lin 屬性 6.1 壓縮打包介紹Linux環境常見壓縮文件類型:.zip,.gz,.bz2,.xz,.tar.gz,.tar.bz2,.tar.xz壓縮打包的目的方便文件傳輸節省磁盤空間減少傳輸花費的時間節省帶寬6.2

2018-1-6 4周5次課 zip壓縮、tar打包

lac add 位置 內容 需要 rec 大文件 all exc 6.5 zip壓縮工具★zip支持壓縮目錄前期準備:[root@localhost d6z]# tree aminglinux/ aminglinux/ ├── 2 │ └── 2.txt └── ami

2018.1.6 4周5次課

復制 ins sun http pan b2c off font 合成 四周第五次課(1月6日)6.5 zip壓縮工具6.6 tar打包6.7 打包並壓縮6.5 zip壓縮工具1. zip壓縮包在Windows和Linux中都比較常用,它可以壓縮目錄和文件,壓縮目錄時,需要

6.22 6.1-6.4

find utf with 網絡傳輸 strong all 完成後 打開 消失 6.1 壓縮打包介紹 壓縮文件和普通文件的區別:壓縮完成後文件變小;網絡傳輸時占用的帶寬資源變少; Linux下常見的壓縮文件後綴名:.zip/.gz/.bz2/.xz/.tar.gz/.tar

漢語言處理包 HanLP 1.6.4 釋出,優化新詞發現

HanLP 是由一系列模型與演算法組成的 Java 工具包,目標是普及自然語言處理在生產環境中的應用。HanLP 具備功能完善、效能高效、架構清晰、語料時新、可自定義的特點。 在提供豐富功能的同時,HanLP 內部模組堅持低耦合、模型堅持惰性載入、服務堅持靜態提

百度地圖4.1_1開發教程(6)點收藏(1

在本章教程中,將一起學習長按地圖收藏該點,這本章中,將設計到的內容有 1.長按時間 2.生成marker 3.地理編碼搜尋(用地址檢索座標)、反地理編碼搜尋(用座標檢索地址) 4.收藏點 5.刪除點等操作 先上效果圖 長按地圖,生成地圖的點,地理編碼搜

VELT-0.1.6開發:載入根文件系統

baidu 轉載 裏的 python lin ide arch 包含 -s 快樂蝦http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651)歡迎轉載,但請保留作者信息VELT的全稱是Vis

angular 4 實戰開發--安卓兼容問題(1

部門 方案 我們 是我 是不是 實戰 發現 版本 功能 首先我強調下我只是個菜鳥,大神不喜勿噴。 先介紹下項目背景,主要是公司的官網h5 ,架構用的是angular4 有點大材小用的趕腳,but ,公司要求。 在項目主功能做的差不多了。交給測試,這時候發現百度瀏覽器,u

HTML5移動開發實戰必備知識——本地存儲(1)

ora chrome 字符串 本地 大小 data- 新技術 使用 應用程序 本地緩存是HTML5出現的新技術,這個技術的出現使得移動web的開發成為了可能。我們都知道。要想打造一個高性能的移動應用,速度是關鍵。而在HTML5之前。僅僅有cooki

web service 用JDK開發 版本在1.6以上

color src ride poi gif port 實現類 調用服務 .org -eclipse開發工具 裏面有自帶Web Services Explorer瀏覽器 在javaEE 下點擊右上角wsdlpage 即可 服務端代碼 package

iOS開發-登錄界面開發(4)AFNetworking的引入-Swfit4.1_Xcode9.3.1

pre 地址 保存 nts install 添加 相關 新版 一個 1.AFNetworking是個啥?   網絡請求開源框架, iOS和Mac OS都能用。 2.SwiftyJSON是個啥?   另一個開源框架,處理JSON數據(解析數據、生成數據)。 3.讓我們

python3 開發面試題(裝飾器必須考)6.4

args 返回 event aps 面試題 wrap spl def pen def f(): print("2018-06-04") # 每次調用f的時候 在打印"2018-06-04" 之前打印一句 開始, 之後再打印一句 結束 d

最新版力軟learun快速開發框架6.1.6.2源碼下載地址

AC sqlsever echarts ron webapp 增加 abc 測試 使用 QQ153545892 力軟敏捷開發框架 6.1.6.2 版本發布 新增手機流程-我的流程(可查看流程進度和表單內容) 新增手機流程-待辦任務(可查看流程進度和表單內容,審

從0到1簡易區塊鏈開發手冊V0.4-實現轉賬交易的思路分析

序列 場景 tran color value lastb ali 區塊 創建 六.轉賬交易 創世區塊創建完畢之後,按照我們的正常思路,是繼續創建新的區塊,並加入至區塊鏈中,沒錯,這確實是學習路線,但是我們首先來了解一個區塊是如何生成的,轉賬交易 ===>打包交易 =