|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包......
模块化是年夜型Java体系的一个主要特性。在这些项目中构建剧本和项目一般被分别为多个模块,以便改善构建历程,可是在运转时却很少思索分别模块的成绩。
在“模块化Java”系列文章的第二篇里,我们将会商静态模块化(staticmodularity)。内容包含怎样创立bundle、将其安装到OSG引擎和如何创建bundle之间的版本依附。鄙人一篇文章中,我们将会商静态模块化(dynamicmodularity)并展现bundle怎样对其他bundle作出呼应。
在上篇文章《模块化Java简介》中讲到,Java在开辟时把package作为模块化单位,部署时把JAR文件作为模块化单位。但是只管像Maven如许的构建工具可以在编译时包管package和JAR的特定组合,但这些依附在运转时classpath下仍大概呈现纷歧致的情形。为懂得决这一成绩,模块能够声明其依附需求,如许,在运转时就能够在实行之行进行依赖反省。
OSGi是一个Java的运转时静态模块体系。OSGi标准形貌了OSGi运转时的事情举动体例;以后版本是OSGiR4.2。
一个OSGi模块(也称为bundle)就是一个一般的JAR文件,但在其MANIFEST.MF中带有附加信息。一个bundle的manifest必需最少包括以下内容:
Bundle-ManifestVersion:对OSGiR4bundle来讲必需是2(OSGiR3bundle则默许为1)
Bundle-SymbolicName:bundle的文本标识符,一般以反向域名的情势呈现,如com.infoq,而且常常对应了包括个中的package
Bundle-Version:major.minor.micro.qualifier情势的版本号,前三个元素是数字(缺省是0),qualifier则是文本(缺省是空字符串)
创立一个bundle
最复杂的bundle必需在manifest文件中包括以下内容:
Bundle-ManifestVersion: 2
Bundle-SymbolicName: com.infoq.minimal
Bundle-Version: 1.0.0
创立bundle并没有甚么可希奇的,那末让我们创立一个带activator的bundle吧。上面是OSGi特定的代码片断,在bundle启动时被挪用,有点像是bundle的main办法。
package com.infoq;
import org.osgi.framework.*;
public class ExampleActivator implements BundleActivator {
public void start(BundleContext context) {
System.out.println("Started");
}
public void stop(BundleContext context) {
System.out.println("Stopped");
}
}
为了让OSGi晓得哪一个类是activator,我们必要在manifest中到场分外的信息项:
Bundle-Activator: com.infoq.ExampleActivator
Import-Package: org.osgi.framework
Bundle-Activator声了然在bundle启动时要实例化并挪用其start()办法的类;相似的,在bundle中断时将挪用该类的stop()办法。
那末Import-Package又是干甚么的?每一个bundle都必要在manifest中界说其依附,以便在运转时判别一切必须代码是不是可用。在本例中,ExampleActivator依附于org.osgi.framework包中的BundleContext;假如我们不在manifext中声明该依附,在运行时就会碰着NoClassDefFoundError毛病。
<p>
java也能做一些底层语言开发做的事情(难度很高,不是java顶尖高手是做不来的), |
|