使用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合作伙伴提供的云服务,单VM 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客户端库,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

示例应用程序

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

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社区中所有即将举行的活动。

查看全部