今天的30天挑戰,我決定來寫OpenShift Eclipse集成。程序在OpenShift上運行,從開始咱們就用OpenShift Eclipse插件遠程開發和部署程序。這個系列大部分咱們會用Eclipse Kepler,請先下載它,而後開始。 html
安裝eclipse很簡單,只需解壓下載的包就可,Linux或者Mac上,打開終端輸入如下命令:java
$ tar -xzvf eclipse-jee-kepler-R-*.tar.gz
Windows上,用7-zip或者其餘解壓工具解壓,解壓後,會有一個eclipse的文件夾,也能夠對可執行文件建立一個快捷方式linux
下載和解壓Java EE的Eclipse Kepler IDE後,打開Eclipse導航到項目空間,到Help>Eclipse Marketplace能夠看到如圖。git
在搜索框內輸入'jboss tools'點擊Go按鈕。 web
點擊後能看到第一個結果'Jboss Tools(Kepler)'.mongodb
如今點擊install按鈕,能夠看到可安裝的插件列表。由於本文的目的是用OpenShift, 只需選擇'Jboss OpenShift Tools', 選擇後點'Confirm'按鈕。數據庫
接受服務條款,點擊'I accept the terms of the license agreement' 而後點Finish.json
Eclipse會給出一個安全警示框由於這個插件沒有簽名,點擊OK, 最後重啓Eclipse使改動生效,點擊Yes重啓。api
安裝後OpenShift Eclipse 插件後,就能夠開始建立程序了。到File>New>Other>OpenShift Application新建程序。瀏覽器
點擊'Next', 會要求提供OpenShift帳號和密碼,若是你尚未OpenShift帳號,能夠點擊窗口上的註冊連接註冊。
點擊從這裏註冊,Eclipse 內置瀏覽器會打開OpenShift註冊頁面,咱們能夠從Windows>Preferences或者Eclipse>Preferences改默認瀏覽器。
經過第一次選擇'用外部瀏覽器'能夠把默認瀏覽器改爲Chrome或者FireFox,而後點New按鈕,輸入你喜歡的瀏覽器信息。
接下來選擇新加的Google Chrome做爲默認瀏覽器。最後點擊Apply 再點OK.
再次到File > New > Other > OpenShift Application,若是再點註冊,連接會在Chrome打開。
註冊後,咱們會獲得一個驗證郵件,這是在開始用OpenShift前須要作的。
成功驗證後,能夠輸入帳號密碼新建OpenShift鏈接,勾上'保存密碼',就不用每次都輸密碼了,填好後點擊Next.
當按Next按鈕時,咱們能夠輸入額外信息恢復密碼,我選的是'No', 咱們也能夠選Yes.
點擊'No'以後,須要新建OpenShift 域,若是咱們這個帳號尚未OpenShift域,那就須要新建一個。這個域名是一個惟一的命名空間,全部程序都在這個空間下。不一樣用戶不會有相同域名,域名能夠是任何不超過32個字符的字母或數字。它是程序url的一部分,例如,程序名sharemylocation,域名onppenshiftcloud,那我完成的程序名是 http://sharemylocation-onopenshiftcloud.rhcloud.com.
接下來,會加載一個視圖,用於上傳ssh密鑰到OpenShift, OpenShift須要SSH.
咱們能夠上傳已有的SSH或者點擊New按鈕新建,如今咱們新建一個密鑰,點擊New.
咱們須要提供密鑰的名字,以及私有和公共密鑰文件名,我用的是個人名字做爲密鑰和文件名。
接下來會被引到程序建立窗口,須要輸入程序信息,包括程序名,類型,gear文件(小型的或者普通型,對於免費用戶,咱們只能用小型的),能否升級程序,是否想嵌入一種或多種cartridge如MySQL, PostgreSQL, MongoDB或者其餘的。咱們採用MongoDB.
而後須要安裝sharemylocation 程序並配置服務適配器,選擇默認點下一步。
接下來會讓咱們指定克隆git倉庫的路徑和遠程git的名字。
最後點擊finish按鈕,程序就會開始建立,這會建立一個叫gear的程序容器,安裝所需的SELinux策略和cgroup配置。OpenShift會在gear安裝MongoDB, Jboss工具 OpenShift插件會顯示MongoDB詳細信息。
OpenShift也會爲你安裝一個私有git倉庫,克隆到本地,而後它會把DNS傳播到網絡。最後,項目會在Eclipse空間做爲Maven項目導入。
導入Eclipse後,會問咱們是否想發佈沒有執行的更新。
你也許會好奇你尚未做任何改動,怎麼會問你發佈更新,緣由是當項目導入到Eclipse, Jboss工具在.settings文件件下建立了一個.jsdtscope的文件,OpenShift Eclipse插件讓咱們發佈時這個文件沒有被忽略,咱們能夠到Git Staging View很容易的忽略它,到 Window > Show View > Other > Git > Git Staging.
在Git Staging視圖下右擊.jsdtscope,選擇忽略。
咱們能夠到OpenShift查看在線運行程序。打開OpenShift Explorer視圖,到 Window > Show View > Other > JBoss Tools > OpenShift Explorer,它會新開一個視圖。
右擊程序,點擊'Web browser', 就會在默認瀏覽器打開程序模板。
在繼續以前,咱們須要瞭解部署流程怎樣工做的。
來作點小改動來更好理解上一步提到的部署流程,打開index.html,作以下更改。
<h1> Welcome to OpenShift, JBossEAP6.0 Cartridge </h1>
改爲
<h1> OpenShift MongoDB Backbone.js Tutorial </h1>
到Git Staging View, 能夠看到更新。
而後拖動更新到Staged Changes, 輸入提交信息。
點擊'Commit'提交,前面提到,不要用'Commit and Push', 它會自動觸發程序發佈,不能查看日誌。這個日誌很重要,當構建失敗時能夠幫到咱們。
到服務器視圖,能夠看到sharemylocation程序的服務器配置。
右擊程序服務,點擊'Publish'.
會有一個窗口確認是否想發佈更新。
點擊'Yes', 它會新開一個控制檯視圖,咱們能夠在這裏查看構建進度。
要查看Jboss EAP程序服務器的日誌文件,在服務器視圖上右擊sharemylocation,而後點Tail files.
而後配置tail只對服務器.log文件,默認的,它會tail全部日誌包括數據庫日誌。
它會另外開一個控制檯視圖,只會tail Jboss EAP服務器.log文件。
最後,咱們能夠在瀏覽器裏右擊sharemylocation>Show In>Web Browser 查看更新.
它會在默認瀏覽器裏顯示咱們在index.html裏作的更新。
默認行爲是當咱們有任何發佈或者git推送時,OpenShift會先中止cartridge(MongoDB和Jboss EAP服務),而後作maven構建,構建成功後,再啓動cartridge,部署war. 這會花不少時間,也不是快速部署的理想狀態。咱們能夠啓動熱部署來加速這個過程,熱部署不會中止cartridge,只需替換war文件。
要激活熱部署,右擊程序,到OpenShift>Configure Markers.
而後咱們會看到一個視圖,能夠配置想激活的OpenShift Markers, 能夠看到,默認的,java7 marker是激活的,這確保程序用Java 7,若是咱們不激活它,Java 6 就會被使用。
咱們選擇Hot Deploy Marker, 這會在 .openshift/markers文件夾下新建空文件hot_deploy.
接下來,到Git Staging View, 能夠看到hot_deploy文件在'Unstaged Changes'下。
拖動hot_deploy文件到'Staged Changes', 填寫提交信息,而後點擊'Commit'.
到'Server View', 發佈更新,如今能夠清晰的從日誌中看到cartridges沒有中止,由於激活了熱部署。
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
太棒了,當程序代碼有更新時它能很快給出反饋,這爲咱們節省了大量時間,提升了效率。
雖然OpenShift是用Java 7構建項目,可是Maven項目仍然用的Java 6, 要更新到Java 7, 在pom.xml裏更新以下屬性。
<maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target>
更改後,點擊項目,到Maven>Update Project.
這就會更新項目到Java 7.
自Java EE 6起,web.xml是可選的,咱們能夠用註釋配置大部分的組件。刪除由OpenShift建立的除index.html之外的全部模板文件。刪除web.xml, health.jsp, snoop.jsp, image文件夾。Git Staging View會顯示更新,而後咱們提交。
若是咱們發佈這些更新,構建會失敗,由於maven war插件配置在pom.xml裏,期待web.xml是存在,最新的Maven war插件添加了一個配置屬性,failOnMissingWebXml屬性通知war插件,若是web.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 View提交更新,而後用前面提到的sharemylocation 服務發佈。
本文最後寫一個簡單的RESTful資源,當有請求到/api/v1/ping時做爲響應返回'{'ping':'pong'}',我習慣寫一個ping服務確保全部配置都正確。
咱們用JAX-RS寫RESTful web services. JAX-RS爲寫RESTful 服務定義了annotation-driven API.
在寫PingResource前,須要激活JAX-RS,建立一個類繼承javax.ws.rs.core。 程序和程序指定路徑用 javax.ws.rs.ApplicationPath.
javax.ws.rs.ApplicationPath. package com.sharemylocation.rest; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/api/v1") public class RestInitializer extends Application { }
最後,寫PingResource用於響應'/api/v1/ping'請求。
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'}"; } }
如今用Git Staging View提交更新,而後用前面提到的sharemylocation 服務發佈。
這就是今天的內容,繼續給反饋吧。
原文:https://www.openshift.com/blogs/day-28-openshift-eclipse-integration-for-java-developers