我尝试在GAE SE上使用Java8+Spring Boot进行开发(还有关于开发环境的一些事情)

我在GAE Java中尝试了Java8+Spring Boot。
基本上,只要按照官方网站的指引就可以了,但在开发环境方面遇到了一些问题,所以写了些笔记。
而且,官方文档有点乱七八糟,不知道应该参考哪个,真的很麻烦。

这次我使用Apache Maven和App Engine插件作为基础,从GitHub存储库中借用内容来尝试制作。

如果有错误或者您认为有更好的方式,请毫不犹豫地提交编辑请求。非常感谢。

我本来是倾向于使用Gradle的,但经过一番尝试之后,因为遇到了许多困难而放弃了。或许如果再好好努力一点,应该就没问题了。

这次的代码我已经放到了Github上。

所需之物

    • Java8

 

    • Maven 3.5

 

    • Gcloud SDK

AppEngine SDK Java

IntelliJ IDEA

Google Cloud Toolsプラグイン

创建应用程序

我认为使用Maven Archetype可以创建最漂亮的结果。

mvn archetype:generate -Dappengine-version=1.9.54 \
-Djava8=true \
-DCloudSDK_Tooling=true \
-DuseObjectify=true \
-Dapplication-id=your-app-id \
-Dfilter=com.google.appengine.archetypes:

如果使用Datastore,似乎推荐使用Objectify,所以如果将useObjectify设置为True,则会自动将它添加到依赖关系中。

稍等一下,当加载完成并进行了一些操作后,会得到以下输出。

[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> com.google.appengine.archetypes:appengine-flexible-archetype (A basic Java application with Google App Engine flexible.)
2: remote -> com.google.appengine.archetypes:appengine-skeleton-archetype (A skeleton application with Google App Engine)
3: remote -> com.google.appengine.archetypes:appengine-standard-archetype (A basic Java application with Google App Engine Standard)
4: remote -> com.google.appengine.archetypes:endpoints-skeleton-archetype (A skeleton project using Cloud Endpoints Frameworks with Google App Engine Standard)
5: remote -> com.google.appengine.archetypes:guestbook-archetype (A guestbook application with Google App Engine)
6: remote -> com.google.appengine.archetypes:hello-endpoints-archetype (A simple starter application using Cloud Endpoints Frameworks with Google App Engine Standard)
7: remote -> com.google.appengine.archetypes:skeleton-archetype (Archetype with a README about Google App Engine archetypes)

对于查看公式说明后不确定应选择哪个的问题,我认为选择3就可以。
想要使用Cloud Endpoints的人可能在4左右吧。
虽然我没有仔细看过,但区别在于Objectify的创建时是否可以指定和Mockito版本是Skeleton(2)就变成了2.0的β版本这样的差异。
生成的代码没有区别。
而且我们会在Spring Boot中运行,所以生成的Java代码以后会被丢弃。

只需回答GroupID、ArtifactID和Package等问题即可。

这个是使用Java 8开发的AppEngine SE的源代码完成了。
只包含了一个Hello World而已。

开发环境

需要以中国语言的一种方式来释义 “IDEAの設定”

默认可能已安装AppEngine插件。
由于此功能已弃用,请将其禁用。

    • Google Cloud Toolsプラグインをインストール

 

    Google App Engineプラグインを無効化

请参考以下详细信息。

スクリーンショット 2017-08-29 16.23.17.png

我认为由于已经内置,无法卸载,所以无效。
我认为它可能会在以后的版本更新中消失。

スクリーンショット 2017-08-29 17.12.24.png
スクリーンショット 2017-08-29 17.18.04.png

创建项目

请随意创建一个空项目。
然后导入模块。

请在项目的SDK中指定Java8版本。

スクリーンショット 2017-08-29 17.13.36.png

增加模块

将创建的应用程序导入IntelliJ的项目中。

スクリーンショット 2017-08-29 17.13.46.png

请指定pom.xml文件并进行导入。

スクリーンショット 2017-08-29 17.15.12.png

导入后,请关闭Project Structure窗口。然后,GAE会自动检测并在右下角询问是否进行设置。请进行配置。

スクリーンショット 2017-08-29 17.15.25.png

然后,它将读取环境并加载设置,使得可以在IntelliJ上执行本地服务器和部署设置。

关于部署,您需要在编辑配置中进行项目设置等操作。

部署设置

スクリーンショット 2017-08-29 17.16.11.png

我选择部署。
选择一个像礼物标志一样的即可。

这样,部署设置和项目设置将显示在下面。

スクリーンショット_2017-08-29_17_16_35.png

请在首次登录时点击按钮,浏览器将打开并登录。如果已经进行过身份认证,会显示您所拥有的项目的图像,请选择目标的GCP项目。

部署选项

スクリーンショット 2017-08-29 17.17.01.png

如果你希望将版本设置为自动生成,那么最好选择 “Version” 设为 “Auto Generate”。
如果你希望将流量发送到部署的版本,那么应该将 “Promote the deployed version to receive all traffic” 设为 “ON”。
如果还涉及到 Cron、Index 等更新的话,将 “Update” 的相关选项也设为 “ON” 会更好。

将其转换为Spring Boot

新增依赖关系

我们来修改pom.xml文件。
由于AppEngine使用的是Jetty,所以需要排除Spring Boot默认的Tomcat。

将添加到中

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring.boot.version}</version>
            <!-- Exclude Tomcat so that it doesn't conflict w/ Jetty server -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Exclude any jul-to-slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <scope>provided</scope>
        </dependency>

在pom.xml文件中添加

    <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

添加到<插件>中

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
            </plugin>

添加到<属性>

        <spring.boot.version>1.5.6.RELEASE</spring.boot.version>

请使用标准的Spring Boot应用程序进行实现。你可以删除通过原型生成的HelloAppEngine文件和index.jsp文件,不会有任何问题。

在启动时,将横幅输出设置为关闭。

由于频繁弹出日志信息让人烦恼,建议将其关闭。若选择打开,则是这样的感觉。

スクリーンショット 2017-08-29 17.25.28.png

让我们在application.yml中添加配置。

spring:
    main:
        banner-mode: "off"

总结

勘察通

这个感觉应该能够正常地在Spring Boot中开发。
老实说,刚开始我阅读文档、查看仓库的源代码的时候,有时候会弄错Maven的任务什么的,感觉有点迷惑。花了一天的时间,但是我觉得如果在本地开发的话,应该可以用这个方法。
如果要通过命令行启动的话,我认为可以使用mvn appengine:run命令。

也许以后可以考虑好好实施这个应用程序。

开机时间是多久?

这一次的源代码几乎没有依赖关系,初次访问需要大约10秒才能启动并开始运行。
个人对此无法发表意见,请各自判断。
(我是根据日志请求开始到应用程序启动日志结束来判断启动时间的,这样判断正确吗?)
请问有人可以告诉我正确的测量方法吗?

我认为它不适合常见的巨型应用程序,因为如果设定了许多依存关系,那么初次启动可能会变得非常慢。

附加物

关于maven的appengine插件的部署,您是使用gcloud app命令是吧。

回复者

这次的源代码在这里。

广告
将在 10 秒后关闭
bannerAds