Day 28: OpenShift的Eclipse集成

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


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

预备要求

  1. 基本Java知识。linux

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

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

Download Eclipse

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

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

1. 安装OpenShfit的Eclipse插件

打开Eclipse,进入你的项目工做空间。打开 Help > Eclipse Marketplace,你会看到以下屏幕。数据库

eclipse marketplace

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

eclipse marketplace search

点击“安装”,会出现选择安装插件的列表。因为本文的目的是演示,咱们只选上JBoss OpenShift Tools。选中以后点击“确认”。segmentfault

Select-OpenShift-and-forge-tools

如今咱们须要接受许可协议。选择接受后点击完成。api

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

相关文章
相关标签/搜索