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

相關文章
相關標籤/搜索