`

如何在插件开发中正确使用第三方jar包

 
阅读更多

如何在插件开发中正确使用第三方jar包

问题描述
  很多开发人员在eclipse插件开发中,经常会遇到第三方jar包无法访问的问题,或者是明明在开发环境中一切正常,导出插件到了运行环境时却出现"NoClassDefFoundError"异常等诸多问题。

  本文结合笔者插件开发遇到的问题,谈谈插件开发过程中应该如何正确配置第三方jar包。

解决过程
在一般插件项目中添加第三方jar包:
  1. 创建你的插件项目,并新建一个文件夹放置你需要的第三方jar包,如:<project>/lib。

  2. 从文件系统中导入或拷贝jar包至<project>/lib文件夹中,如:<project>/lib/activation.jar。

  3. 打开MANIFEST.MF文件,在插件编辑器的"Runtime"Tab页中,把第三方jar包添加到"Classpath"面板中。


haha@sh 2011年04月21日 13:46
4. 如果该插件需要被其他插件依赖,则需要在插件编辑器的"Runtime"Tab页中,在"Exported Packages"面板中添加所有允许访问的包。


通过图形界面编辑器配置后的MANIFEST.MF文件如下:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Primeton Studio EosTest Core Plug-in
Bundle-SymbolicName: com.primeton.studio.eostest.core
Bundle-Version: 6.0.0
Bundle-Vendor: %Primeton
Bundle-Localization: plugin
Bundle-ClassPath: lib/activation.jar,
lib/jaxb-api.jar,
lib/jaxb-impl.jar,
lib/jsr173_1.0_api.jar
Export-Package: com.primeton.studio.eostest.core,
com.primeton.studio.eostest.core.model.cut,
...
javax.activation,
javax.xml.bind,
javax.xml.bind.annotation,
javax.xml.bind.annotation.adapters,
javax.xml.bind.attachment,
javax.xml.bind.helpers,
javax.xml.bind.util,
javax.xml.stream,
javax.xml.stream.events,
javax.xml.stream.util
Require-Bundle: com.primeton.studio.runtime,
org.eclipse.core.resources

haha@sh 2011年04月21日 13:47
构建插件项目:
  5. 打开build.properties文件,在插件编辑器的"Build"Tab页的"Binary Build"面板中,选中需要构建的内容。



生成的build.properties文件如下:

output.. = bin/
bin.includes = META-INF/,\
               plugin.xml,\
               lib/jaxb-api.jar,\
               lib/jaxb-impl.jar,\
               lib/jsr173_1.0_api.jar,\
               lib/activation.jar,\
               plugin.properties,\
               plugin_zh_CN.properties
src.includes = META-INF/,\
               src/,\
               plugin.properties,\
               plugin.xml,\
               plugin_zh_CN.properties,\
               build.properties

haha@sh 2011年04月21日 13:48
在插件项目B中引用一个插件项目A的类:
  6. 首先,需要保证该类所在的包在插件A的MANIFEST.MF文件Export-Package:中,如上步骤4。

  7. 其次,打开插件项目B的MANIFEST.MF文件,在插件编辑器的"Dependencies"Tab页中,把插件项目A添加到"Required Plug-ins"面板中。如果仅仅是在插件项目B的"Java Build Path"添加了插件项目A,则运行时肯定会出现运行时"NoClassDefFoundError"问题。


haha@sh 2011年04月21日 13:49
导出插件项目:
  8. 选中插件项目,在导出向导里选中"Deployable plug-ins and fragments"选项导出。

   
  9. 导出的插件分为三种形式,文件夹、zip包、jar包。导出的内容包括在上面插件项目构建步骤中,build.properties文件bin.includes中选中的内容。

   
  10. 其中jar包的形式需要在"Options"选项里选中"Package plug-ins as individual JAR archives"选项。

   


haha@sh 2011年04月21日 13:52
配置Feature项目:
  我们在做类似这样的产品时,会创建一个feature项目用来描述所有的插件项目配置信息。如果我们将一个包含第三方类库jar包的插件导出成一个jar包的形式,运行产品时不会出现任何问题,可一旦需要在该产品上进行二次插件开发时,则会出现无法访问插件jar包里的第三方jar包的问题。

  在dev.eclipse.org上也搜索到同样的问题描述,估计是eclipse本身不支持访问jar包内的jar文件造成的:

  "Adding lib/my.jar meant the plugin will always be a directory instead of a jar (eclipse doesn't load jars from withing jars). By default, my plugin itself shows up as the "." library, which isn't included in a directory plugin that includes other jars."

  因此需要将类似包含第三方jar包的插件导出成文件夹的形式,具体步骤如下。打开feature.xml文件,在功能编辑器的"Plug-ins"Tab页,选中想要配置的插件,并在"Plug-in Details"面板中,选中"Unpack the plug-ins archive after the installation",这样在插件安装后会将插件解压成文件夹形式。

   
  对于已经打成jar包的插件,也可以通过手动修改的方式实现。选中一个插件jar文件,解压成同名文件夹,将类包压缩成jar文件,如:swt.jar,并删除原先的类包。

  修改META-INF下的MANIFEST.MF文件,如原先内容:

Bundle-ClassPath: lib/ktable_2.1.3.jar,
.
  则改成:

Bundle-ClassPath: lib/ktable_2.1.3.jar,
swt.jar
  即可。

将第三方jar包单独包装成一个插件项目:
  另外对于项目中使用到大量的第三方jar包时,可以采用eclipse官方推荐的方式,把第三方jar单独包装成一个插件项目。

  按Ctrl+N,在新建对话框里选择"Plug-in from existing JAR archives",按下一步选择你需要的jar文件。

   
  再下一步指定这个plugin的名称,注意这一步里一般要把最下面的"Unzip the JAR archives into the project"选项清除,否则eclipse会把jar文件全部展开为.class文件树,最后按Finish就可以了。

   

分享到:
评论

相关推荐

    java开源包8

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包4

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包1

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包2

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包3

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包11

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包6

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包5

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包10

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包7

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包9

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包101

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    Java资源包01

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    网狐荣耀版开发使用常见问题解答

    这个主要是第三方的类库与cocos2d-x的支持文件没有加载的原因造成,加载了就可以正常运行了。 十、网狐荣耀版手机端分享时出现“由于不支持的分享类型,无法分享到微信“的解决办法 去腾讯开放平台申请账号,...

    Java EE常用框架.xmind

    使用mvn编译,而后在class目录生成jar包,使用Java命令来启动 使用@configurationProperties和@Value注解来获取SpringBoot配置文件上的信息 使用@SpringBootTest来搭建测试环境,使用@AutoConfigueMockMVC类...

    JAVA上百实例源码以及开源项目源代码

    Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四”...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    connect-1.3.0-all-in-one

    已登录用户还可以将在第三方网站发布、分享的信息即时同步到QQ空间,使网站内容通过好友关系得到进一步的传播,从而提升网站的访问量和用户数。 ===前提准备=== * 在开始搭建开发环境之前,您必须掌握如下知识或...

    支持多数据库的ORM框架ef-orm.zip

    间接依赖仅有commons-lang, slf4j等7个通用库,作为一个ORM框架,对第三方依赖极小。简单直接的API 框架的API设计直接面向数据库操作,不绕弯子,开发者只需要数据库基本知识,不必学习大量新的操作概念即可使用API...

Global site tag (gtag.js) - Google Analytics