Apache Maven 是基于 Java™ 的项目的一个强大的构建工具。Maven 自动解析构建流程所需的组件或插件的依赖关系,从 Maven 存储库下载它们。本教程将展示如何结合使用 Bluemix DevOps Services 交付管道和 Maven。我们将从一个简单的 Java 应用程序和一个关联的单元测试开始,您将在交付管道中配置一个构建阶段,以便使用 Maven 执行构建和测试。然后您将添加第二个阶段来将应用程序推送到云。
本教程包含两个独立的章节。第一节是一个快速练习,您在其中为一个预先构建的 Maven 项目配置 Bluemix DevOps Services 管道。在第二节(即更高级的一节)中,您将在使用交付管道之前从头开发一个 Maven 项目。您将在第二个练习中学到更多的知识,所以推荐您阅读完该练习。
阅读: Apache Maven 2 简介
阅读: IBM Bluemix DevOps Services 简介,第 4 部分:使用交付管道自动部署到 Bluemix
阅读: 交付管道入门
阅读: 构建和部署资源
观看: 观看 IBM Bluemix 实战演示
“ 您将在交付管道中配置一个构建阶段,以便使用 Maven 完成构建和测试。然后您将添加第二个阶段,将应用程序推送到云。 ”
对于所有两节内容:
对于从头构建练习(可选):
运行应用程序
获取代码
Java 应用程序本身很简单,不是本教程的重点,但它的代码演示了两个很有用的基本编程技术。
要配置您自己的交付管道并将应用程序推送到您的 Bluemix 帐户,必须在 Bluemix 上创建一个空间并创建我的 Bluemix DevOps Services 项目的分支。
myDeveloperWorksMaven
作为项目名称。选择一个 Bluemix 空间并在其他字段中保留默认值: 在这一步中,您将配置交付管道,以便从您存储库中签出源代码,运行 Maven 命令来构建示例应用程序和运行 JUnit 测试。
点击查看大图
关闭 [x]
现在您已经使用 Maven 自动构建应用程序并对其进行了单元测试,您还可以添加一个阶段来自动将该应用程序部署到 Bluemix。
myDeveloperWorksMavenUniqueName
,其中 UniqueName
表示 Bluemix 上的一个惟一名称。您部署的应用程序的 URL 将为 https://myDeveloperWorksMaven UniqueName .mybluemix.net。 在 Deploy Script 字段中,将第二行替换为:
cf push "${CF_APP}" -p developerWorks-1.0-SNAPSHOT.jar -b java_buildpack
在这一步中,您将从头创建 Maven 项目。
运行以下命令:
mvn archetype:generate -DgroupId=com.ibm.developer -DartifactId=mavenFromScratch -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
该命令创建了一个 Maven 结构的项目,其中包含:
现在您将在 GitHub 上创建一个存储库,然后从 Bluemix DevOps Services 连接到它。
点击查看大图
关闭 [x]
mavenFromScratch
并单击 Create repository 按钮: mavenFromScratch
作为项目名称,选择 Connect to an external GitHub repository 。 https://github.com/yourGitHubUserName/mavenFromScratch.git
输入到 URL 字段中。 cd
转到 mavenFromScratch 目录。 git init
命令,将此项目初始化为一个 Git 项目。 运行以下命令将本地和远程存储库联系在一起:
git remote add origin https://github.com/<em>yourGitHubUserName</em>/mavenFromScratch.git
现在您需要在 Maven 项目结构中执行一些更改,并将它们推送回存储库。
</dependencies>
标记之后,粘贴以下代码段:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <mainClass>com.ibm.developer.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
最终版本类似于:
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ibm.developer</groupId> <artifactId>developerWorks</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>developerWorks</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <mainClass>com.ibm.developer.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>pom.xml 文件在 MANIFEST.MF 文件中创建一个主要类条目,以便最终的 JAR 可由 Cloud Foundry
java-buildpack
执行。
testApp()
方法,使它看起来类似于: public void testApp() { assertTrue( App.veryComplicatedMethod() == 42 ); }保存文件。
package com.ibm.developer; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * Hello world! * */ public class App { public static void main(String[] args) throws IOException { int port = Integer.parseInt(System.getenv("VCAP_APP_PORT")); ServerSocket ss = new ServerSocket(port); while (true) { Socket s = ss.accept(); s.getOutputStream() .write(("HTTP/1.1 200 OK/nContent-Type: text/html; charset=utf-8/nContent-Length: 2/n/n" + veryComplicatedMethod()) .getBytes()); } } public static int veryComplicatedMethod() { return 42; } }保存文件。您已经为将所有内容推送到存储库做好了准备。
Java 代码现在将创建一个 JUnit 测试,测试您的 App
类中的一个业务方法,它还会创建一个基本的、单线程的 HTTP Web 服务器来处理 Bluemix 中的请求。在生产应用程序中,将 ss.accept()
返回的 Socket
传递给一个单独的线程,并在写入响应后关闭它,这一步对于本演示用例是没有必要的。
cd
转到 mavenFromScratch。 将所有文件添加到第一个提交集合中:
git add -A。
运行:
git commit -m "modified maven project"
):
git push -u origin master
现在您可以使用自己的存储库代替我创建的存储库。跳到快速练习节中的第 2 步,配置 Bluemix DevOps Services 交付管道并完成练习。
在本教程中,您学习了如何在 Bluemix DevOps Services 中为一个 Maven 项目快速创建一个交付管道。在高级章节中,您还学习了如何从头设置一个 Maven 项目,并在 Bluemix DevOps Services 中将它推送到 Git 存储库。在此过程中,您学习了一些 JUnit 基础知识,以及如何在 Java 中使用 3 行代码编写一个 HTTP 服务器。