【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

问题

插件开发中, 有时候我们会在内部使用一些第三方的 lib, 这些 lib 可能会与我们服务器中的 lib 相冲突。 从而导致插件无法继续运行的尴尬场面。


解决方案

 2019.07.03 后的版本中, plugin.xml 加入了 prefer-packages 属性,解决这个方法。

 2020.03.25 后的版本中, prefer-packages 属性可以支持通配符 * ,方便设置批量加载

案例


<prefer-packages>
	<prefer-package>com.fr.harrison</prefer-package>
</prefer-packages>



之后,当加载到相关的类时, 比如 com.fr.harrison.test1. 
则会避免双亲委派, 先从 plugin/classes 或者 plugin/lib 中读取类。
从而避免在插件内部使用一些类时与我们服务器中的 lib 冲突。

如果有多个可以使用多个子节点 prefer-package。


<prefer-packages>
	<prefer-package>com.fr.harrison</prefer-package>
	<prefer-package>com.fr.alex</prefer-package>
</prefer-packages>


通配符使用方式

<prefer-packages>
	<prefer-package>*</prefer-package>
	<prefer-package>com.fr.*</prefer-package>
	<prefer-package>com.fr.*.harrion.*</prefer-package>
</prefer-packages>



  • No labels

8 Comments

  1. Anonymous

    这个属性的值是开发的插件的包吗,为什么我设置了还是没有用?

  2. 这个值 应该是插件引用的第三方包的类路径,防止插件引入的包和工程本身的包冲突问题的

  3. Anonymous

    两个包都是一个路径,如果路径不同也不会冲突了吧

  4. Anonymous

    应该是指定lib的路径吧,可是看例子这么写又不像是,实例也说的不清晰

    1. 额 这个的作用就是解决类冲突问题的,如果没有这个问题 就不需要加这个标签

      1. Anonymous

        但是不知道这个标签具体该怎么定义

        1. 假设你在WEB-INF/lib下放了4.0的httpclient包,在插件下也是用了httpclient包,但是版本是5.0的,因为默认是优先加载WEB-INF/lib下的jar包,这时候就可能出现你在插件中用的新的API无法调用,报ClassNotFound之类的异常,这个时候就可以在plugin.xml中增加一个标签说明,让插件优先使用自带的5.0的httpclient的jar,示例如下:

          <prefer-packages>
              <prefer-package>org.apache.httpclient</prefer-package>
          </prefer-packages>
          1. Anonymous

            明白了,谢谢