编者注:咱们发现了有趣的系列文章《30天学习30种新技术》,正在翻译,一天一篇更新,年终礼包。下面是第 28 天的内容。html
今天的《30天学习30种新技术》 我決定介绍OpenShift的Eclipse集成。应用将运行在OpenShift上,咱们将使用OpenSHift的Eclipse插件来开发和部署一个应用。java
基本Java知识。linux
在你的系统上安装最新版的JDK。你能够安装OpenJDK 7和Oracle JDK 7。OpenShift支持 OpenJDK6 和 7。git
从官网 下载最新的 Eclipse 包。 在撰写本文的时候,最新的Eclipse包叫做Kepler。web
安装eclipse很容易,解压缩便可。mongodb
tar -xzvf eclipse-jee-kepler-R-*.tar.gz
打开Eclipse,进入你的项目工做空间。打开 Help > Eclipse Marketplace,你会看到以下屏幕。数据库
在搜索框中搜寻“jboss tools”。第一个结果就是“JBoss Tools(Kepler)”。json
点击“安装”,会出现选择安装插件的列表。因为本文的目的是演示,咱们只选上JBoss OpenShift Tools。选中以后点击“确认”。segmentfault
如今咱们须要接受许可协议。选择接受后点击完成。api
Eclipse会警告该插件未签名。点击“确认”而后Eclipse会要求重启,点击“是”,重启一下。
插件安装好以后,建立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
,会在默认浏览器中打开模板应用。
编写功能代码,经过Git Staging view提交到Git。Git Staging view提供可视化的界面,让咱们很容易地查看和比较咱们做的改动。
在Git Staging View下,咱们有两个选择。或者咱们仅仅做一个本地提交,或者同时推送到远程。推送到远程以后哦,OpenShift将开死后构建咱们的应用。
为了更好地理解上述工做流,让咱们作个小改动——修改下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.
咱们能够在默认浏览器里看到改动。
默认配置下,一旦咱们发布了应用,或者进行了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"
好极了!改动代码以后很快就能获得反馈。节省了不少时间,提升了咱们的生产效率。
尽管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。
Java EE 6以上版本下,web.xml
为可选。咱们能够使用annotation配置大多数组建。咱们将删除web.xml
、health.jsp
、snop.jsp
和image文件夹。git staging视图将显示这些改动,咱们能够提交。
若是如今发布,那么构建会失败。由于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视图提交改动。而后发布。
咱们将编写一个简单的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'}"; } }
提交、发布以后,咱们能够查看效果:
今天的内容就是这些了。继续回馈。
原文 Day 28: OpenShift Eclipse Integration for Java Developers
翻译 SegmentFault