使用 appengine 模块意味着创建动态 Web 应用程序而不是通常的 appengine Web 应用程序项目。云端点与通常的 appengine Web 应用程序项目配合良好,但这些不支持 appengine 模块。
问题是,如果我尝试在动态 Web 应用程序上生成云端点客户端库,则会收到错误消息“不是 App Engine 项目”。
有没有办法让动态 Web 应用程序被识别为 App Engine 项目,以便可以在其上生成云端点客户端库?
使用 appengine 模块意味着创建动态 Web 应用程序而不是通常的 appengine Web 应用程序项目。云端点与通常的 appengine Web 应用程序项目配合良好,但这些不支持 appengine 模块。
问题是,如果我尝试在动态 Web 应用程序上生成云端点客户端库,则会收到错误消息“不是 App Engine 项目”。
有没有办法让动态 Web 应用程序被识别为 App Engine 项目,以便可以在其上生成云端点客户端库?
目前正在解决同样的问题,我想我已经找到了一个具有以下设置的解决方案(使用 maven 进行 java 项目):
在项目根 pom.xml 中:定义了一些常用值(如您正在使用的 appengine 版本)、一个pom
包装和您的模块,尤其是一个 EAR 模块:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject-root</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<name>myproject-root</name>
<properties>
<appengine.app.version>1</appengine.app.version>
<appengine.target.version>1.9.11</appengine.target.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<modules>
<module>myproject-ear</module>
<module>myproject-cloud-endpoints</module>
<module>myproject-backend</module>
</modules>
</project>
EAR 模块的 pom.xml 当然应该有 EAR 打包,但也应该对其他模块有“war”类型的依赖关系,并且 maven-ear 插件的“unpack types”选项设置为“war”:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>myproject-root</artifactId>
<version>1.0</version>
</parent>
<groupId>com.example</groupId>
<artifactId>myproject-ear</artifactId>
<version>1.0</version>
<packaging>ear</packaging>
<name>myproject-ear</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.9</version>
<configuration>
<version>5</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<unpackTypes>war</unpackTypes>
<applicationXml>${project.basedir}/src/main/application/META-INF/maven-application.xml</applicationXml>
</configuration>
</plugin>
<plugin>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>${appengine.target.version}</version>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>myproject-cloud-endpoints</artifactId>
<version>1.0</version>
<type>war</type>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>myproject-backend</artifactId>
<version>1.0</version>
<type>war</type>
</dependency>
</dependencies>
<properties/>
</project>
最后,“cloud-endpoints” pom.xml 应配置为带有“war”包装的基本云端点 webapp 项目:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>myproject-root</artifactId>
<version>1.0</version>
</parent>
<groupId>com.example</groupId>
<artifactId>myproject-cloud-endpoints</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>myproject-cloud-endpoints</name>
<dependencies>
<!-- Compile/runtime dependencies -->
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>${appengine.target.version}</version>
</dependency>
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-endpoints</artifactId>
<version>${appengine.target.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
</dependencies>
<build>
<!-- for hot reload of the web application in devserver-->
<outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>display-dependency-updates</goal>
<goal>display-plugin-updates</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<version>3.1</version>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<webXml>${project.build.directory}/generated-sources/appengine-endpoints/WEB-INF/web.xml</webXml>
<webResources>
<resource>
<!-- this is relative to the pom.xml directory -->
<directory>${project.build.directory}/generated-sources/appengine-endpoints</directory>
<!-- the list has a default value of ** -->
<includes>
<include>WEB-INF/*.discovery</include>
<include>WEB-INF/*.api</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
<plugin>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>${appengine.target.version}</version>
<configuration>
<enableJarClasses>false</enableJarClasses>
<!-- Comment in the below snippet to bind to all IPs instead of just localhost -->
<!-- address>0.0.0.0</address>
<port>8080</port -->
<!-- Comment in the below snippet to enable local debugging with a remove debugger
like those included with Eclipse or IntelliJ -->
<!-- jvmFlags>
<jvmFlag>-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n</jvmFlag>
</jvmFlags -->
</configuration>
<executions>
<execution>
<goals>
<goal>endpoints_get_discovery_doc</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
构建这个项目,您应该能够通过 Eclipse 生成您的云端点客户端库:右键单击“云端点”项目 =>“ Google App Engine WTP ”=>“生成云端点客户端库”将生成所需的一切在myproject-cloud-endpoints/endpoint-libs/
.
希望有帮助!
这种情况的解决方案在 François POYER 答案中,但这是一个没有假定 maven 的版本。
如果您使用 WTP 创建和管理您的 appengine 应用程序和 EAR:
如果您没有看到Google App Engine WTP并且您只看到“Google”,那么您可能没有选择 Java EE 透视图。
您不必为此使用 maven,只需使用 WTP 来创建和管理您的 EAR 和 appengine 应用程序。