【发布时间】:2012-10-31 16:12:33
【问题描述】:
我正在尝试在由 maven 故障安全插件运行的测试套件的 @BeforeClass 内启动嵌入式 Google App Engine 开发服务器 (sdk 1.7.3)。应该启动它的代码如下所示:
private static final String HOST = "0.0.0.0";
private static final int PORT = 8887;
private static DevAppServer devAppServer;
@BeforeClass
public static void setup() throws Exception {
log.debug("Starting development server");
File appRootDir = new File("target/visualize-1.0.war");
DevAppServerFactory devAppServerFactory = new DevAppServerFactory();
devAppServer = devAppServerFactory.createDevAppServer(appRootDir, HOST, PORT);
devAppServer.start();
}
但是在调用 createDevAppServer 期间,我遇到了一个安全异常:
java.security.AccessControlException: access denied (java.lang.RuntimePermission setContextClassLoader)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.Thread.setContextClassLoader(Thread.java:1394)
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:366)
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
使用 -Djava.security.debug=access,failure 调试安全异常,我看到了:
access: access allowed (java.io.FilePermission /home/me/.m2/repository/com/google/appengine/appengine-tools-sdk/1.7.3/appengine-tools-sdk-1.7.3.jar read)
access: access denied (java.security.SecurityPermission getPolicy)
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1249)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:364)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.security.Policy.getPolicy(Policy.java:133)
at com.google.apphosting.utils.security.SecurityManagerInstaller.install(SecurityManagerInstaller.java:81)
at com.google.appengine.tools.development.DevAppServerFactory.createDevAppServer(DevAppServerFactory.java:152)
at com.google.appengine.tools.development.DevAppServerFactory.createDevAppServer(DevAppServerFactory.java:69)
at com.google.appengine.tools.development.DevAppServerFactory.createDevAppServer(DevAppServerFactory.java:53)
我做错了什么?
【问题讨论】:
-
我也尝试过指定一个完全宽松的安全策略,如下所示:grant { permission java.security.AllPermission;权限 java.lang.reflect.ReflectPermission "suppressAccessChecks"; };但后来我只是谷歌代码的另一个例外,说已经安装了安全管理器
-
我对答案很感兴趣,但与此同时,我很好奇您正在编写的需要运行应用服务器的集成测试类型。我们有几个使用各种 LocalServiceTestHelpers 的集成测试以及针对通过 Ant 启动的开发服务器运行的 UI 测试。 UI 测试运行缓慢,因此我一直在寻找更快获得相同测试覆盖率的方法。
-
嗨凯尔,也许我的情况与你无关;我没有使用 GWT,但实际上是用于 GAE 的 Restlet——提供 REST Web 服务。然后我用 JSON 消费这些。
-
感谢接受 - 整个项目在 github.com/ipeirotis/ReadabilityMetrics/ 中,它也是一个 RESTful 服务器。也许你可能会学到一两个技巧。
-
@aldrinleal - 感谢您的提示!我去看看。
标签: java google-app-engine maven integration-testing