OSGi领域包创建与非捆绑依赖处理
立即解锁
发布时间: 2025-08-21 01:41:10 阅读量: 1 订阅数: 2 


OSGi与Spring构建模块化Java应用
### OSGi 领域包创建与非捆绑依赖处理
#### 1. OSGi 模块化与领域包创建
OSGi 的核心在于模块化,其模块化的基本单位是包(bundle)。OSGi 包本质上就是普通的 JAR 文件,只是在清单文件中多了一些额外信息。之前我们创建了一些简单的包,现在要为 “Dude, Where’s My JAR?” 应用开发更实用的包。
首先,我们要创建该应用的第一个包,这是一个仅导出单个包且不发布或消费任何服务的简单包。不过,即便简单,我们也会遇到一些有趣的问题,比如如何处理对非 OSGi 就绪的第三方 JAR 文件的依赖。
我们使用 Pax Construct 的 `pax-create-bundle` 脚本在 `dwmj` 项目目录下生成一个包子项目,用于承载应用中的领域对象。具体命令如下:
```
dwmj% pax-create-bundle -p dwmj.domain -n domain \
? -g com.dudewheresmyjar -v 1.0.0-SNAPSHOTs
```
这里,`-p` 指定包的根包,`-n` 指定包的名称,`-g` 指定包的 Maven 组 ID,`-v` 指定版本号。执行该命令后,会在 `dwmj` 下的 `domain` 目录生成领域包项目。在该目录中,我们能找到以下重要文件:
- `pom.xml`:包含用于构建包项目的 Maven 构建指令,该项目以顶级 `dwmj` 项目为父项目,且在顶级项目的 `pom.xml` 中,领域项目已被添加为子项目。
- `osgi.bnd`:Pax Construct 借助 BND 工具自动为包项目生成清单文件,该文件包含指导 BND 生成清单的指令。对于领域包,此文件初始为空。
- `src` 目录结构:包含一些 Java 类文件,是 Pax Construct 创建新包项目时作为占位符放置的示例代码。不过这些示例服务和激活器 Java 文件对我们的领域包并无用处,完成查看后可删除,我们需要创建一个代表索引中 JAR 文件的领域类。
#### 2. 定义领域类
应用的主要功能是为 JAR 文件提供搜索引擎,内部使用名为 `JarFile` 的领域类来表示 JAR 文件,代码如下:
```java
package dwmj.domain;
public class JarFile {
private String repository;
private String groupId;
private String artifactId;
private String version;
private boolean snapshot;
private String rawUrl;
private boolean hasSource;
private boolean hasJavadoc;
private String bundleSymbolicName;
private Set<String> packages;
public String getPackageNames() {
if(packages == null) return "";
String packageNames = "";
for (String p : packages) {
packageNames += (p + " ");
}
return packageNames;
}
private Set<String> classes;
public String getClassNames() {
if(classes == null) return "";
String classNames = "";
for (String c : classes) {
classNames += (c + " ");
}
return classNames;
}
// NOTE: property setter/getter methods left out
// for brevity's sake
}
```
`JarFile` 类包含了索引工件的有用信息,由于应用使用 Maven 仓库作为 JAR 文件的来源,该类持有可用于在 Maven 仓库中查找 JAR 文件的信息,如仓库、组 ID、工件 ID 和版本。此外,还有两个布尔属性,分别指示 JAR 文件是否为快照版本以及是否为 OSGi 包。
为了让 `JarFile` 类的信息能被索引和搜索,我们使用 Compass 开源搜索框架,对类进行注解:
```java
@Searchable(alias = "jar")
public class JarFile {
@SearchableProperty(store = Store.YES, index = Index.UN_TOKENIZED)
private String repository;
@SearchableProperty(store = Store.YES, index = Index.UN_TOKENIZED)
private String groupId;
@SearchableProperty(store = Store.YES, index = Index.UN_TOKENIZED)
private String artifactId;
@SearchableProperty(store = Store.YES, index = Index.UN_TOKENIZED)
private String version;
@SearchableProperty(store = Store.YES, index = Index.UN_TOKENIZED)
private boolean snapshot;
@SearchableProperty(store = Store.YES, index = Index.UN_TOKENIZED)
private String rawUrl;
@SearchableProperty(store = Store.YES, index = Index.UN_TOKENIZ
```
0
0
复制全文
相关推荐










