Reputation: 2074
I am trying to start an embedded Google App Engine Development Server (sdk 1.7.3) inside a @BeforeClass of a test suite run by the maven failsafe plugin. The code that should start it looks like this:
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();
}
However during the call to createDevAppServer, I get a security exception:
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)
debugging the security exception with -Djava.security.debug=access,failure I see:
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)
What am I doing wrong?
Upvotes: 4
Views: 646
Reputation: 3609
Actually, you're not supposed to call GAE the way you've done (hint: GAE has so many patches for dealing with security its simply not worth it)
However, the maven-gae-plugin does have gae:start and gae:stop specially for IT.
This is how I use it for IT:
<plugin>
<groupId>net.kindleit</groupId>
<artifactId>maven-gae-plugin</artifactId>
<version>0.9.4</version>
<dependencies>
<dependency>
<groupId>net.kindleit</groupId>
<artifactId>gae-runtime</artifactId>
<version>1.6.6</version>
<type>pom</type>
</dependency>
</dependencies>
<executions>
<execution>
<id>start-integration-test</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop-integration-test</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.12</version>
<executions>
<execution>
<id>it</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
</executions>
</plugin>
Upvotes: 2