Day 28: OpenShift的Eclipse集成
今天的《30天學習30種新技術》 我決定介紹OpenShift的Eclipse集成。應用將運行在OpenShift上,我們將使用OpenSHift的Eclipse插件來開發和部署一個應用。
預備要求
基本Java知識。
在你的系統上安裝最新版的JDK。你可以安裝OpenJDK 7和Oracle JDK 7。OpenShift支持 OpenJDK6 和 7。
從官網 下載最新的 Eclipse 包。 在撰寫本文的時候,最新的Eclipse包叫作Kepler。
安裝eclipse很容易,解壓縮即可。
tar -xzvf eclipse-jee-kepler-R-*.tar.gz1. 安裝OpenShfit的Eclipse插件
打開Eclipse,進入你的項目工作空間。打開 Help > Eclipse Marketplace,你會看到如下屏幕。
在搜索框中搜尋“jboss tools”。第一個結果就是“JBoss Tools(Kepler)”。
點擊“安裝”,會出現選擇安裝插件的列表。由于本文的目的是演示,我們只選上JBoss OpenShift Tools。選中之后點擊“確認”。
現在我們需要接受許可協議。選擇接受后點擊完成。
Eclipse會警告該插件未簽名。點擊“確認”然后Eclipse會要求重啟,點擊“是”,重啟一下。
2. 創建一個OpenShift應用
插件安裝好之后,創建OpenShift應用很容易。
在eclipse中點擊 File > New > Other > OpenShift Application,在下圖所示頁面中點擊“下一步”:
需要填寫OpenShift賬號信息,如果你還沒有注冊,你可以點擊“現在注冊”,會有一個向導界面引導你注冊。
接下來要創建一個OpenShift域名。每一個賬號有且僅有一個獨特的域名。域名構成了OpenShift分配給應用的URL的一部分。例如,如果你的應用的名字是“sharemylocation”,你的域名是“onopenshiftcloud”,那么應用的URL就是 http://sharemylocation-onopenshiftcloud.rhcloud.com。
接著我們需要上傳SSH key到OpenShift. SSH key 用于進行Git操作和訪問應用gear。
我們可以上傳已有的,也可以新建。點擊New按鈕可以新建。
我們需要提供key名和私鑰、公鑰的文件名。
接著會出現應用創建向導,我們需要填寫應用的一些細節。注意選擇MongoDB。
接著我們需要配置sharemylocation應用和服務器。選擇默認的就行。
接著會詢問關于git倉庫的一些信息。保留默認選項即可。
最后,點擊“完成”按鈕。這將為我們創建一個應用容器(gear),自動配置SELinux和cgroup。OpenShift同時將創建一個私有的git倉庫并克隆到本地。然后會配置DNS。OpenShift也將安裝MongoDB。
最后,這個項目會以Maven項目的形式被導入到Eclipse的工作空間。
導入之后,會詢問是否將未提交的代碼推送到OpenShift。
你可能會尋思,你并沒有改動這個應用,那為什么會詢問是否推送呢?原因在于當項目導入到Eclipse的時候,JBoss在.settings文件夾下創建了一個.jsdtscope文件。由于這個文件并沒有被忽略,OpenShift Eclipse插件會詢問是否部署。我們可以設置忽略這個文件,訪問Window > Show View > Other > Git > Git Staging.
我們可以在OpenShift的explore view中查看我們的在線應用。訪問Window > Show View > Other > JBoss Tools > OpenShift Explorer.
右擊應用,點擊Web browser,會在默認瀏覽器中打開模板應用。
3. 理解開發工作流
編寫功能代碼,通過Git Staging view提交到Git。Git Staging view提供可視化的界面,讓我們很容易地查看和比較我們作的改動。
在Git Staging View下,我們有兩個選擇。或者我們僅僅作一個本地提交,或者同時推送到遠程。推送到遠程之后哦,OpenShift將開死后構建我們的應用。
4. 第一個改動
為了更好地理解上述工作流,讓我們做個小改動——修改下index.html:
<h1>OpenShift MongoDB Backbone.js Tutorial </h1>訪問Git Staging view能看到改動:
將改動拖到到Staged Changes,撰寫提交信息。
點擊Commit按鈕提交改動。如上所述,不要使用Commit and Push,以免觸發應用部署而不顯示構建日志。構建日志很有用,特別是在構建失敗的時候。
訪問Server view:
右擊應用服務器,點擊發布:
會出現確認框,點擊Yes。
會出現一個console界面,顯示構建的進展:
如果想查看JBoss EAP的應用服務器,只需在Server view下右擊sharemylocation,選擇Tail files.
默認tail所有的日志文件,包括數據庫日志文件。我們將配置僅僅tail server.log文件。
這會開啟一個新的console界面,里面只顯示JBoss EAP server.log
最后,我們可以在瀏覽器里查看改動,右擊sharemylocation服務器,接著點擊 Show In > Web Browser.
我們可以在默認瀏覽器里看到改動。
5. 熱部署
默認配置下,一旦我們發布了應用,或者進行了git push,OpenShift會停止MongoDB和JBoss EAP server等服務,然后做一個maven構建,構建完畢之后才會重啟各項服務,開始部署。這會消耗很多時間,不利于快速開發。我們可以通過啟用熱部署來提速。熱部署僅僅替換文件而不會停止服務。
右擊項目,訪問OpenShift > Configure Markers來激活熱部署。
然后需要做一些配置。我們看到Java 7默認是啟用的。如果將其禁用,那么應用將使用Java 6。
我們啟用Hot Deploy。這會在.openshift/markers文件夾下創建一個hot_deploy空文件。
接著我們訪問Git Staging視圖,可以看到hot_deploy文件位于Unstaged Changes中。
將其拖動到Staged Changes,撰寫提交信息,點擊Commit按鈕提交。
轉到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。
7. 刪除模板文件
Java EE 6以上版本下,web.xml為可選。我們可以使用annotation配置大多數組建。我們將刪除web.xml、health.jsp、snop.jsp和image文件夾。git staging視圖將顯示這些改動,我們可以提交。
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視圖提交改動。然后發布。
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
總結
以上是生活随笔為你收集整理的Day 28: OpenShift的Eclipse集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Day 27: Restify —— 在
- 下一篇: Day 29:编写你的第一个 Googl