返回介绍

Day 28: OpenShift 的 Eclipse 集成

发布于 2025-01-31 20:47:32 字数 13184 浏览 0 评论 0 收藏 0

今天的 《30 天学习 30 种新技术》 我決定介绍 OpenShift 的 Eclipse 集成。应用将运行在 OpenShift 上,我们将使用 OpenSHift 的 Eclipse 插件来开发和部署一个应用。

预备要求

  1. 基本 Java 知识。
  2. 在你的系统上安装最新版的 JDK。你可以安装 OpenJDK 7Oracle JDK 7 。OpenShift 支持 OpenJDK6 和 7。
  3. 官网 下载最新的 Eclipse 包。 在撰写本文的时候,最新的 Eclipse 包叫作 Kepler。

安装 eclipse 很容易,解压缩即可。

tar -xzvf eclipse-jee-kepler-R-*.tar.gz

1. 安装 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. 理解开发工作流

  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 能看到改动:

将改动拖到到 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.xmlhealth.jspsnop.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

今天的内容就是这些了。继续回馈。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文