编者注:我们发现了有趣的系列文章《30天学习30种新技术》,正在翻译,一天一篇更新,年终礼包。下面是第 28 天的内容。


今天的《30天学习30种新技术》 我決定介绍OpenShift的Eclipse集成。应用将运行在OpenShift上,我们将使用OpenSHift的Eclipse插件来开发和部署一个应用。

预备要求

  1. 基本Java知识。

  2. 在你的系统上安装最新版的JDK。你可以安装OpenJDK 7Oracle JDK 7。OpenShift支持 OpenJDK6 和 7。

  3. 官网 下载最新的 Eclipse 包。 在撰写本文的时候,最新的Eclipse包叫作Kepler。

Download Eclipse

安装eclipse很容易,解压缩即可。

tar -xzvf eclipse-jee-kepler-R-*.tar.gz

1. 安装OpenShfit的Eclipse插件

打开Eclipse,进入你的项目工作空间。打开 Help > Eclipse Marketplace,你会看到如下屏幕。

eclipse marketplace

在搜索框中搜寻“jboss tools”。第一个结果就是“JBoss Tools(Kepler)”。

eclipse marketplace search

点击“安装”,会出现选择安装插件的列表。由于本文的目的是演示,我们只选上JBoss OpenShift Tools。选中之后点击“确认”。

Select-OpenShift-and-forge-tools

现在我们需要接受许可协议。选择接受后点击完成。

Accept License

Eclipse会警告该插件未签名。点击“确认”然后Eclipse会要求重启,点击“是”,重启一下。

2. 创建一个OpenShift应用

插件安装好之后,创建OpenShift应用很容易。

在eclipse中点击 File > New > Other > OpenShift Application,在下图所示页面中点击“下一步”:

create-openshift_app-eclipse

需要填写OpenShift账号信息,如果你还没有注册,你可以点击“现在注册”,会有一个向导界面引导你注册。

Signin OpenShift

接下来要创建一个OpenShift域名。每一个账号有且仅有一个独特的域名。域名构成了OpenShift分配给应用的URL的一部分。例如,如果你的应用的名字是“sharemylocation”,你的域名是“onopenshiftcloud”,那么应用的URL就是 http://sharemylocation-onopenshiftcloud.rhcloud.com

Enter domain name

接着我们需要上传SSH key到OpenShift. SSH key 用于进行Git操作和访问应用gear。

我们可以上传已有的,也可以新建。点击New按钮可以新建。

add ssh key

我们需要提供key名和私钥、公钥的文件名。

SSH Key Details

接着会出现应用创建向导,我们需要填写应用的一些细节。注意选择MongoDB。

Application Details preview

接着我们需要配置sharemylocation应用和服务器。选择默认的就行。

Setup OpenShift Application

接着会询问关于git仓库的一些信息。保留默认选项即可。

git

最后,点击“完成”按钮。这将为我们创建一个应用容器(gear),自动配置SELinux和cgroup。OpenShift同时将创建一个私有的git仓库并克隆到本地。然后会配置DNS。OpenShift也将安装MongoDB。

mongodb

最后,这个项目会以Maven项目的形式被导入到Eclipse的工作空间。

导入之后,会询问是否将未提交的代码推送到OpenShift。

push uncommited changes

你可能会寻思,你并没有改动这个应用,那为什么会询问是否推送呢?原因在于当项目导入到Eclipse的时候,JBoss在.settings文件夹下创建了一个.jsdtscope文件。由于这个文件并没有被忽略,OpenShift Eclipse插件会询问是否部署。我们可以设置忽略这个文件,访问Window > Show View > Other > Git > Git Staging.

git staging view

我们可以在OpenShift的explore view中查看我们的在线应用。访问Window > Show View > Other > JBoss Tools > OpenShift Explorer.

OpenShift Explore View

右击应用,点击Web browser,会在默认浏览器中打开模板应用。

3. 理解开发工作流

  1. 编写功能代码,通过Git Staging view提交到Git。Git Staging view提供可视化的界面,让我们很容易地查看和比较我们作的改动。

  2. 在Git Staging View下,我们有两个选择。或者我们仅仅作一个本地提交,或者同时推送到远程。推送到远程之后哦,OpenShift将开死后构建我们的应用。

4. 第一个改动

为了更好地理解上述工作流,让我们做个小改动——修改下index.html

<h1>
    OpenShift MongoDB Backbone.js Tutorial
</h1>

访问Git Staging view能看到改动:

Git Staging View First Change

将改动拖到到Staged Changes,撰写提交信息。

Git Staging View Drag to Staged Changes

点击Commit按钮提交改动。如上所述,不要使用Commit and Push,以免触发应用部署而不显示构建日志。构建日志很有用,特别是在构建失败的时候。

访问Server view:

Sharemylocation Server view

右击应用服务器,点击发布:

Application First Publish

会出现确认框,点击Yes。

publish confirmation

会出现一个console界面,显示构建的进展:

Application First Build

如果想查看JBoss EAP的应用服务器,只需在Server view下右击sharemylocation,选择Tail files.

OpenShift Tail Files

默认tail所有的日志文件,包括数据库日志文件。我们将配置仅仅tail server.log文件。

OpenShift Configure Tail Files Dialog

这会开启一个新的console界面,里面只显示JBoss EAP server.log

OpenShift JBoss EAP Server

最后,我们可以在浏览器里查看改动,右击sharemylocation服务器,接着点击 Show In > Web Browser.

OpenShift Server View show in web browser

我们可以在默认浏览器里看到改动。

Application Change in Browser

5. 热部署

默认配置下,一旦我们发布了应用,或者进行了git push,OpenShift会停止MongoDB和JBoss EAP server等服务,然后做一个maven构建,构建完毕之后才会重启各项服务,开始部署。这会消耗很多时间,不利于快速开发。我们可以通过启用热部署来提速。热部署仅仅替换文件而不会停止服务。

右击项目,访问OpenShift > Configure Markers来激活热部署。

OpenShift Configure Markers

然后需要做一些配置。我们看到Java 7默认是启用的。如果将其禁用,那么应用将使用Java 6。

Configure OpenShift Markers

我们启用Hot Deploy。这会在.openshift/markers文件夹下创建一个hot_deploy空文件。

Enable Hot Depoyment Marker

接着我们访问Git Staging视图,可以看到hot_deploy文件位于Unstaged Changes中。

Git Staging View to commit hot_deploy

将其拖动到Staged Changes,撰写提交信息,点击Commit按钮提交。

Commit OpenShift Enable Hot Depolyment

转到Server视图发布改动。构建日志会显示热部署已启用。

Not stopping cartridge jbosseap because hot deploy is enabled
Not stopping cartridge mongodb because hot deploy is enabled
Building jbosseap cartridge
Scaling down Maven heap settings due to presence of hot_deploy marker
Found pom.xml... attempting to build with 'mvn -e clean package -Popenshift -DskipTests'
Apache Maven 3.0.3 (r1075437; 2011-06-20 13:22:37-0400)
Maven home: /etc/alternatives/maven-3.0
Java version: 1.7.0_45, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.45/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "2.6.32-358.23.2.el6.x86_64", arch: "i386", family: "unix"
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building sharemylocation 1.0
[INFO] ------------------------------------------------------------------------
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /var/lib/openshift/526f931ce0b8cd94f300003f/app-root/runtime/repo/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ sharemylocation ---
[INFO] Packaging webapp
[INFO] Assembling webapp [sharemylocation] in [/var/lib/openshift/526f931ce0b8cd94f300003f/app-root/runtime/repo/target/sharemylocation]
[INFO] Processing war project
[INFO] Building war: /var/lib/openshift/526f931ce0b8cd94f300003f/app-root/runtime/repo/deployments/ROOT.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
Starting application sharemylocation
Not starting cartridge mongodb because hot deploy is enabled
Deploying jbosseap cartridge
Not starting cartridge jbosseap because hot deploy is enabled

类似的,server日志会显示它只是替换了WAR文件。这是秒部署。

2013/10/30 03:31:57,174 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015877: Stopped deployment ROOT.war (runtime-name: ROOT.war) in 260ms
2013/10/30 03:31:57,200 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015876: Starting deployment of "ROOT.war" (runtime-name: "ROOT.war")
2013/10/30 03:31:57,316 INFO  [org.jboss.web] (ServerService Thread Pool -- 67) JBAS018210: Register web context: 
2013/10/30 03:31:57,630 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018565: Replaced deployment "ROOT.war" with deployment "ROOT.war"

好极了!改动代码之后很快就能得到反馈。节省了很多时间,提高了我们的生产效率。

6. 升级到Java 7

尽管OpenShift使用Java 7构建项目,但是Maven项目仍然使用Java 6。修改pom.xml中的以下属性,以便升级到Java 7。

<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>

改动之后,右击项目,Maven > Update。

Update Maven Project

7. 删除模板文件

Java EE 6以上版本下,web.xml为可选。我们可以使用annotation配置大多数组建。我们将删除web.xmlhealth.jspsnop.jsp和image文件夹。git staging视图将显示这些改动,我们可以提交。

Git staging Delete Template

8. 更新Maven War插件

如果现在发布,那么构建会失败。因为maven war插件预设web.xml存在。最新版的Maven war插件添加了一个配置属性。failOnMissingWebXml属性会告诉war插件,构建不应仅因web.xml不存在而失败。

修改pom.xml

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <outputDirectory>deployments</outputDirectory>
        <warName>ROOT</warName>
    </configuration>
</plugin>

使用Git Staging视图提交改动。然后发布。

Git Staging Update Maven War Plugin

9. 编写PingResource

我们将编写一个简单的RESTful服务,当/api/v1/ping收到请求后会回应{'ping': 'pong'},以确保一切工作正常。

我们将使用JAX-RS来编写RESTful服务。JAX-RS定义了一组annotation驱动的API,可以用于编写RESTful服务。

编写PingResource,我们需要在应用中启用JAX-RS。创建一个javax.ws.rs.core的扩展类。

package com.sharemylocation.rest;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/api/v1")
public class RestInitializer extends Application {

}

最后,我们编写响应/api/v1/ping请求的PingResource。

package com.sharemylocation.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/ping")
public class PingResource {

    @GET
    @Produces(value = "application/json")
    public String ping() {
        return "{'ping': 'pong'}";
    }
}

提交、发布之后,我们可以查看效果:

PingResource Demo

今天的内容就是这些了。继续回馈。


原文 Day 28: OpenShift Eclipse Integration for Java Developers
翻译 SegmentFault


weakish
24.6k 声望844 粉丝

a vigorously lazy deadbeat with matured immaturity