OSGi enRoute – 2.1_3 – 创建一个应用程序

如何操作

在之前的章节中,我们在~/git/com.acme.prime目录下创建了一个干净、全新的OSGi enRoute工作空间,并且选择了Bndtools视图。在这一部分,我们将在此工作空间中创建一个应用程序工程,它将会运行在OSGi框架中。这个应用程序将提供基于Google的Angular JS 和Twitter的Bootstrap的Web UI。我们将会使用内置的OSGi enRoute模板,因为该模板已经设置了所需的内容(理所当然!)。

创建bndtools工程

现在开始创建一个新的Bndtools工程,选择File/New/Bndtools OSGi Project菜单。

不同时期的菜单可能会有些小改变。例如Bnd OSGi Project可能会是Bndtools Project。

20170806_001

这将会打开一个用于选择模板的向导界面。在本教程中必须使用OSGi enRoute模板,因为我们的工作空间并非设置用于其它类型的模板。OSGi enRoute模板会基于工程名称的后缀创建具体的工程类型。在本例中我们将创建一个应用程序工程。

20170806_002

选择命名很重要,我们发现使用与Java包命名风格类似、以工作空间名称作为前缀的名称是工程的最佳命名方式。因此我们选择了com.acme.prime.upper.application作为名称。对OSGi enRoute来说,.application后缀是很重要的,因为它定义了我们将使用的模板。因此我们需要在第一个页面中输入此名称。

20170806_003

选择Next按钮进入Java Settings页面,由于OSGi enRoute已经完成了设置,因此这里一般不需要进行修改。

20170806_004

我们可以直接点击Finish按钮结束向导。

Code编码

OSGi enRoute模板已经为我们生成了部分代码。对应的源码生成了了一个单页Web应用程序。

双击UpperApplication.java源文件打开Java编辑器,看看我们需要的代码是什么样子的。

20170806_005

那么这里都有些什么呢?你首先看到的是一些注解。它们确保我们已经将应用程序所需的Web资源都包含进来了,例如AngularBootstrap以及服务于静态页面的web extender。然后是component注解,它使得此对象成为了一个Declarative Servicesservice componentService component在实现某个接口时会被自动注册为一个服务并且它可以依赖于其它服务。

这里的UpperApplication component实现了REST接口,因此它注册了一个REST服务。此服务的协议表示在此类中的所有public方法都会变成一个REST路径(End-point)。

getUpper方法对应着GET方法(对,它以get前缀开头。如果你需要一个POST方法这可以将其命名为postUpper)并且与之映射的URI为/rest/upper。由于它接受一个参数,因此我们可以通过/rest/uper/<单词>格式的URI来指定需要转换为大写格式的单词。在 service catalog处你可以找到更多关于REST API的信息。

REST方法可能会被一个不被信任的外部源码调用,因此它们需要通过授权检查来进行保护。

OSGi enRoute 的REST支持用于通过浏览器来调用你的应用。如果你必须实现一个复杂的REST API,则最好是使用JAX-RS。OSGi正在处理如何将服务API标准化为JAX-RS。

HTML资源

由于这是一个单页Web 应用,我们也需要一些Javascript和CSS静态资源。

此应用程序的资源都存放在我们的bundle中的static文件夹下。这些资源直接映射到根路径上。也就是说,在本地路径static/abc/def下的资源会被映射到URI路径/abc/dfe上。

static/com.acme.prime.upper/index.html 文件中包含了单页HTML的root。它定义了一个header、view部分以及一个footer。

com.acme.prime.upper/main/htm 文件夹包含HTML Fragment,这些Fragment会根据URI来在主页上展示。看看这些资源并且注意看看它们是如何在构建环境中使用宏的。

自动生成资源

在Java代码中我们会需要一些JavaScript和CSS资源。如果你看看index.html文件就会看到如下所示的内容:

根据Bundle中的注解,OSGi enRoute会在所需的位置自动插入CSS或JavaScript代码。另外,它最后会将这些代码放到Bundle的web文件夹中。

目前我们还不需要了解更多的细节,此时我们只需要看到它能正常运行就好了!当你看到它全部运行之后,理解它是一件很容易的事情。

定义一个运行时

双击com.acme.prime.upper.bndrun文件并且选择Run选项卡。在这个选项卡上我们可以添加在运行时所需的内容(Requirement)。由于我们已经通过注解指定了Requirement,因此根据列出来的初始需求我们的应用程序已经可以运行了。不过这是默认的情况,你也可以将列在左边的bundle添加到Requirement列表中,不过此时我们假设已经足够满足运行所需了。

20170806_006

 

因此点击 Resolve按钮。这将会打开一个对话框,其中会向你展示在运行时哪些Bundle是必须的。

20170806_007

点击Finish按钮将会设置对应的Run Bundle列表。这个列表默认情况下是隐藏起来的,如果你希望查看最终的Bundle清单,则可以选择展开该列表。

20170806_008

注意每次你带年纪Resolve按钮,对应的-runbundles清单就会被新的解析结果重写一遍。因此如果你使用Resolve功能,那么绝对不要直接将Bundle添加到-runbundles中!

保存com.acme.prime.upper.bndrun文件然后点击窗口右上角的Debug OSGi按钮。

20170806_008_2

你的应用程序现在可以运行起来了,它正在等待用户来使用强大的大写转换功能:

http://localhost:8080/com.acme.prime.upper!

点击To Upper按钮,这将会要求你输入一个单词,然后将结果打印到提醒栏上。

20170806_009

调试

当然,你永远都不需要调试OSGi enRoute工程,因为它是当之无愧的神器!不过神器也不是天生的,,因此还是让我们来看看如何调试这个工程吧……

你可以像调试其他Java工程一样来调试这个工程。你可以设置断点和单步跟踪。这里与传统的Java程序只有一点不同:在这里,一旦我们造成了改变就会重新生成并部署一个Bundle。如果你改变并保存了一些代码,一个新的Bundle就会被部署。如果你在bndrun文件中增加了新的Requirement,则那些新的Bundle将会被部署,而不再需要的Bundle则会被移除。这个机制运行得很好,因此对于有时Eclipse会弹出对话框来提示你没有成功替代类文件,你可以选择忽略,因为bnd并不依赖Eclipse的这种替代机制。

20170806_010

因此,选择勾选对应的单选框并且忽略此对话框。最后,我们修改代码,将大写转换代码改成小写转换。(不要杀掉运行着的框架。)

如果改变了JavaScript或html Fragment,你需要在浏览器中刷新页面来重新加载。其它情况下你只需要点击按钮来重新尝试。很少需要你重启框架。

OSGi 细节

我们现在运行在一个框架中,不过还没有看到太多关于框架的东西。显然,我们需要一个工具来查看那些Bundle正在运行中以及那些服务已经注册了。每个应用程序工程都有一个基本的bndrun文件和一个debug.bndrun文件。debug.bndrn文件继承自基本的bndrun文件,同时还增加了更多查看框架内部情况的支持信息。

首先通过点击控制台视图上的红色按钮关闭运行中的框架。如果你同时结束了某些调试工作,那么你可能希望返回Bndtools视图。

然后双击debug.bndrun文件并且选择Run选项卡,然后点击Resolve按钮。这将会给你更大的Bundle清单。调试enRoute的设置将会增加一个Web控制台、XRay、一个Web服务器等。这些都是非常有用的工具。

此时窗体会与下图很相似。注意没有列出的需求,因为它们从com.acme.prime.upper.bndrun 继承而来。

20170806_011

因此保存debug.bndrun文件并且点击Debug OSGi按钮。首先,这个bndrun将会运行在跟踪模式(Trace mode)下(你可以通过-runtrace属性来控制它,你可以双击debug.bndrun文件并选择Source选项卡来查看它)。在跟踪模式中,启动器(Launcher)提供了关于启动进程的详细信息以及当bndtools发生变化时正在更新的进程。

我们现在已经有了一个带有XRay的Web控制台。可以通过http://localhost:8080/system/console/xray来访问之。

如果需要你登录,可以使用下面的用户名和密码:

20170806_012

在后续的完整教程中,XRay的功能将会得到进一步解释。

创建一个可执行文件

在本快速入门教程的最后,让我们来创建一个可以在应用程序之外运行的可执行JAR。Bnd(tools)的export功能可以创建一个JAR文件,其中包含所有依赖,包括启动器和框架。这对于一些企业应用开发者来说有时难以理解,Java居然可以运行在应用服务器之外!

双击com.acme.prime.upper.bndrun文件并且选择Run选项卡。在窗体的顶部你将会看到如下按钮:

20170806_008_2

Export按钮会根据对应的bndrun文件的说明来创建一个可执行JAR。它跟你在Eclipse中运行代码会是一样的效果。点击Export按钮:

20170806_013

点击Next按钮进入向导页面,它将会要求你填写保存可执行JAR文件的路径。建议你将其保存在桌面并且使用com.acme.prime.upper.jar作为文件名:

20170806_014

然后我们点击Finish按钮。

请确保没有任何框架是正在运行的。因为如果有一个Web服务器在运行,则我们可能会得到关于8080端口号冲突的信息。

如果我们的代码能够正常运行则会展示一个shell界面。

此时我们可以通过http://localhost:8080/com.acme.prime.upper 看到应用程序已经通过命令行运行起来了。

你可以在Shell界面上使用Ctrl+C来退出程序。

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2017/08/osgi-enroute-0201-03/
百度已收录