在Eclipse插件开发中,直接引入普通JAR会导致依赖解析失败(如No available bundle exports package ‘javax.websocket’)。核心原因是OSGi容器需要特殊的Bundle元数据。以下是经过实战验证的完整解决方案:
步骤 1:创建 Eclipse 插件项目
创建插件项目
- 操作路径: File → New → Plug-in Project
- 命名规范: 使用反向域名(如 org.apache.commons.io)
- 取消激活器: 勾选 Generate an activator 的 取消
导入原始 JAR
- 在项目中创建 /lib 目录
- 拖放待转换的 JAR 文件(如 commons-io-2.14.0.jar)至 /lib
- 右键 JAR → Build Path → Add to Build Path
步骤 2:配置 MANIFEST.MF
Bundle-ManifestVersion: 2
Bundle-SymbolicName: {Bundle唯一标识,如 org.apache.commons.io}
Bundle-Version: x.y.z.qualifier # 四段式版本(例:2.14.0.20230701)
Bundle-ClassPath: lib/{原始JAR文件名} # 例:lib/commons-io-2.14.0.jar
Export-Package:
{需暴露的包};version="{版本号}", # 例:org.apache.commons.io;version="2.14.0"
Import-Package:
*;resolution:=optional # 声明可选依赖(如非必要包)
Bundle-RequiredExecutionEnvironment: JavaSE-17 # 指定最低JDK版本
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Apache Commons IO
Bundle-SymbolicName: org.apache.commons.io
Bundle-Version: 2.14.0.20230701
Bundle-ClassPath: lib/commons-io-2.14.0.jar
Export-Package:
org.apache.commons.io;version="2.14.0",
org.apache.commons.io.file;version="2.14.0",
org.apache.commons.io.input;version="2.14.0"
Import-Package:
org.osgi.framework;version="[1.8,2)",
javax.servlet;resolution:=optional
Bundle-RequiredExecutionEnvironment: JavaSE-17
步骤 3:配置构建属性(build.properties)
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
lib/commons-io-2.14.0.jar
步骤 4:导出 OSGi Bundle
生成插件
- 右键项目 → Export → Plug-in Development → Deployable plug-ins
- 输出目录:/target/plugins
- 生成文件:org.apache.commons.io_2.14.0.20230701.jar
验证 Bundle 结构
unzip -l org.apache.commons.io_2.14.0.20230701.jar
# 确认包含:
# META-INF/MANIFEST.MF
# lib/commons-io-2.14.0.jar

5548

被折叠的 条评论
为什么被折叠?



