使用 Maven 快速部署到 Cloud Foundry

工程 | Gunnar Hillert | 2011 年 9 月 22 日 | ...

Apache Maven 在 Java 社区中是构建和部署应用程序的非常流行的选择。Cloud Foundry 团队发布了 **Cloud Foundry Maven 插件**,以集成到应用程序的开发生命周期中,包括部署到云。同一个 Maven 插件可用于管理推送到任何 Cloud Foundry 实例的应用程序的推送和更新。

Cloud Foundry 的主要承诺之一是让开发者的生活变得更加轻松,同时又不限制可用选择。Cloud Foundry 不仅支持多种语言(Java、Groovy、Scala、Ruby 等)和框架(Spring、Grails、Rails、Sinatra、Lift 等),还允许您将应用程序部署到不同的环境。这包括公共云,例如 Cloudfoundry.comAppFog.com合作伙伴提供的云服务,单虚拟机 Micro Cloud Foundry,以及使用 Cloud Foundry 开源软件构建您自己的私有云,该软件在非常宽松的 Apache License v2 下对所有人开放。

我们希望您在如何将应用程序部署到 Cloud Foundry 方面拥有完全的选择权。到目前为止,您可以采用以下方式:

隆重推出 Cloud Foundry Maven 插件。通过 Cloud Foundry Maven 插件,开发者现在可以轻松地将云部署集成到其 Maven 项目的生命周期中。此插件还为您提供了更简单的方法,可以从持续集成服务器(如 HudsonJenkins)部署您的应用程序。除其他功能外,Cloud Foundry Maven 插件允许您:
  • 将基于 Maven 的项目部署(推送)到 Cloud Foundry
  • 从 Cloud Foundry 取消部署基于 Maven 的项目
  • 重新部署(更新)基于 Maven 的 Cloud Foundry 项目
虽然此插件模仿了 VMC、Grails 插件和 STS,但它确保用户体验对 Maven 来说是原生的。在底层,它使用了开源的 Cloud Foundry Java Client 库,该库也被 STS Cloud Foundry 插件使用。要使用 Cloud Foundry Maven 插件,您只需要安装 Apache Maven

借助 Cloud Foundry Maven 插件,您只需使用类似以下的命令即可构建和部署您的应用程序:


$ mvn cf:push

如果您不熟悉 Maven,可以参考 Josh Long 的博客文章《Green Beans: Getting Started with Maven and Spring》。

示例应用程序

为了开始并说明基本步骤,我想使用 SpringSource 的 Cloud Foundry 示例集合中的一个超级简单的基于 Maven 的Hello Java 应用程序。此应用程序的唯一功能是输出应用程序正在运行的主机和端口。

Screenshot of the deployed Cloud Foundry sample application

让我们下载并构建示例应用程序(请确保已安装 Git)。


$ git clone https://github.com/SpringSource/cloudfoundry-samples.git
$ cd cloudfoundry-samples/hello-java
$ mvn clean package

这应该会在项目的 target 文件夹中生成一个名为 ‘hello-java-1.0.war’ 的 war 文件。

初始部署到 CloudFoundry.com

现在,让我们设置 Cloud Foundry Maven 插件。作为最小配置,您必须将插件添加到项目的 pom.xml 文件中。


    <plugin>
        <groupId>org.cloudfoundry</groupId>
        <artifactId>cf-maven-plugin</artifactId>
        <version>1.0.0.M1</version>
    </plugin>

此外,该插件的里程碑版本尚未在 Maven Central 存储库中提供。因此,请确保您还将 Spring Framework Milestone Repository 添加到 pom.xml 文件中。



 <pluginRepositories>
         ...
	<pluginRepository>
	    <id>repository.springframework.maven.milestone</id>
	    <name>Spring Framework Maven Milestone Repository</name>
	    <url>http://maven.springframework.org/milestone</url>
	</pluginRepository>
        ...
</pluginRepositories>

这代表了最基本的配置。当然,您通常希望添加一些额外的配置选项,例如:

  • Cloud Foundry 目标 URL
  • 用户凭据(用户名和密码)
  • 应用程序 URL
  • 使用的 Cloud Foundry 服务(例如 MySQL 或 Mongo)
这是带有附加参数的 pom.xml 文件。


    <project>
	      ...
	    <build>
	        <plugins>
	            <plugin>
	                <groupId>org.cloudfoundry</groupId>
	                <artifactId>cf-maven-plugin</artifactId>
	                <version>1.0.0.M1</version>
	                <configuration>
	                    <server>mycloudfoundry-instance</server>
	                    <target>http://api.cloudfoundry.com</target>
	                    <url>hello-java-maven.cloudfoundry.com</url>
	                    <memory>256</memory>
	                </configuration>
	            </plugin>
	        </plugins>
	    </build>
	      ...
    </project>

那么 Cloud Foundry 登录凭据呢?虽然可以将这些凭据作为配置参数存储在 pom.xml 文件中,但我们建议将它们单独存储在 Maven 的 settings.xml 文件中。该文件通常位于用户主目录下的 .m2 文件夹中,例如 ~/.m2/settings.xml

典型的条目可能如下所示:



    <settings>
        ...
	    <servers>
	        ...
	        <server>
	          <id>mycloudfoundry-instance</id>
	          <username>[email protected]</username>
	          <password>s3cr3t</password>
	        </server>
	    </servers>
	    ...
    </settings>

请注意,在您的 pom.xml 中,您使用与 settings.xml 中的元素匹配的配置参数(值为 ‘mycloudfoundry-instance’)来引用 settings.xml 中的服务器参数。作为另一个选项,您还可以将 Cloud Foundry 凭据作为命令行参数提供。

请记住,所有配置参数都可以通过命令行属性设置,这对于一次性操作、测试等非常有用。例如,您可以将上面显示的所有配置参数表示为:


$ mvn cf:info [email protected] -Dcf.password=s3cr3t -Dcf.memory=256 -Dcf.url=hello-java-maven.cloudfoundry.com \
              -Dcf.target=http://api.cloudfoundry.com

Cloud Foundry Maven 插件的命令行参数优先于基于 pom.xml 的参数。此外,许多配置参数都有合理的默认值。有关更多详细信息,请阅读参考文档,网址为 https://github.com/cloudfoundry/vcap-java-client

为了本示例的方便,我们将继续使用 pom.xml 和 settings.xml 中的扩展配置。

现在我们已经为项目配置了插件,我们可以执行一些命令了。通常,使用 Maven 插件的所有调用都遵循相似的模式:


$ mvn cf:<<command>> [-Dcf.some_parameters] [-Dcf.some_other_parameter...]

让我们进行初始部署,并将应用程序推送到 Cloudfoundry.com。


$ mvn cf:push

这可能会失败,因为上面为应用程序定义的 URL(hello-java-maven.cloudfoundry.com)已被占用(我的实例)。因此,您将看到以下错误消息:

...'The URI: "hello-java.cloudfoundry.com" has already been taken or reserved'...

因此,请确保您为应用程序选择的 URL 没有被其他人占用。请尝试使用唯一的 URL 参数重试 - 几秒钟后,我希望可以祝贺您使用 Maven 成功部署了第一个应用程序到 Cloud Foundry!

接下来我们将更新应用程序。让我们编辑:

/src/main/java/org/cloudfoundry/samples/HelloServlet.java

我将只更改一些文本输出,例如:


    public class HelloServlet extends HttpServlet {

         protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ...
            writer.println("Cloud Foundry Rocks - Your application host's Ip address and port is: " + System.getenv("VCAP_APP_HOST") + ":" + System.getenv("VCAP_APP_PORT"));
            ...
        }
    }

更改后,执行以下 Maven 命令:


$ mvn clean cf:update

命令完成后,您应该会在已部署的应用程序中看到更改已生效。

部署到本地 Micro Cloud Foundry

随着 Micro Cloud Foundry 的最新发布,您现在可以离线运行您的云应用程序,直接从您的笔记本电脑运行,当然 Cloud Foundry Maven 插件也会支持您的本地部署。要设置您的 Micro Cloud Foundry 实例,请按照以下步骤操作:

http://support.cloudfoundry.com/entries/20316811

一旦您的 Micro Cloud Foundry 运行起来,您就需要设置一个本地用户。要做到这一点,请执行以下 Maven 命令:


$ mvn cf:register -Dcf.target=http://api.YOURMICROCLOUDNAME.cloudfoundry.me -Dcf.username=<provide new username> \
               -Dcf.password=<provide new password>

请注意,用户名必须是电子邮件地址的形式。之后,我们就可以开始使用我们的本地 Micro Cloud Foundry 实例了。命令与部署到 Cloudfoundry.com 时完全相同。例如,您可以通过执行以下操作在本地部署示例应用程序:


$ mvn cf:apps -Dcf.target=http://api.YOURMICROCLOUDNAME.cloudfoundry.me -Dcf.password=s3cr3t -Dcf.username=the_username_registered_above \
              -Dcf.url=hello-java.YOURMICROCLOUDNAME.cloudfoundry.me

我们的应用程序现在应该正在运行了。为了验证,让我们列出已部署的应用程序:


$ mvn cf:apps -Dcf.target=http://api.YOURMICROCLOUDNAME.cloudfoundry.me -Dcf.password=s3cr3t -Dcf.username=the_username_registered_above
    ...
+-------------+---+---------+--------+-----------------------------------------------+----------+
| Application | # | Health  | Memory | URLS                                          | Services |
+-------------+---+---------+--------+-----------------------------------------------+----------+
| hello-java  | 1 | STARTED | 512    | hello-java.YOURMICROCLOUDNAME.cloudfoundry.me |          |
+-------------+---+---------+--------+-----------------------------------------------+----------+

未来发展

目前,Cloud Foundry Maven 插件只提供了 VMC 提供的一部分功能。在接下来的几周里,我们预计将实现尽可能有意义的功能对等。请在 Github 上关注该项目,我们非常感谢您的反馈。让我们开始编码吧——还在担心基础设施已经过时了!

资源

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有