今天的30天挑战,我决定来写OpenShift Eclipse集成。程序在OpenShift上运行,从开始我们就用OpenShift Eclipse插件远程开发和部署程序。这个系列大部分我们会用Eclipse Kepler,请先下载它,然后开始。
安装eclipse很简单,只需解压下载的包就可,Linux或者Mac上,打开终端输入以下命令:
$ tar -xzvf eclipse-jee-kepler-R-*.tar.gz
Windows上,用7-zip或者其他解压工具解压,解压后,会有一个eclipse的文件夹,也可以对可执行文件创建一个快捷方式
下载和解压Java EE的Eclipse Kepler IDE后,打开Eclipse导航到项目空间,到Help>Eclipse Marketplace可以看到如图。
在搜索框内输入'jboss tools'点击Go按钮。
点击后能看到第一个结果'Jboss Tools(Kepler)'.
现在点击install按钮,可以看到可安装的插件列表。因为本文的目的是用OpenShift, 只需选择'Jboss OpenShift Tools', 选择后点'Confirm'按钮。
接受服务条款,点击'I accept the terms of the license agreement' 然后点Finish.
Eclipse会给出一个安全警示框因为这个插件没有签名,点击OK, 最后重启Eclipse使改动生效,点击Yes重启。
安装后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