【问题标题】:Trouble integrating docx4j with a JIRA plugin将 docx4j 与 JIRA 插件集成时遇到问题
【发布时间】:2017-02-10 14:14:40
【问题描述】:

我一直在尝试将 docx4j 与自定义 JIRA 插件集成,我玩得很开心。第一种方法是添加:

<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j</artifactId>
    <version>3.3.2</version>
</dependency>

pom.xml 文件。该插件构建良好,但部署(通过 UPM)处于禁用状态,并发出有关缺少功能的警告。我检查了日志,基本错误似乎是:

Caused by: org.osgi.framework.BundleException: Unresolved constraint in bundle <project_bundle> [233]: Unable to resolve 233.0: missing requirement [233.0] osgi.wiring.package; (osgi.wiring.package=com.google.appengine.api.images)
at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
at com.atlassian.plugin.osgi.factory.OsgiPlugin.enableInternal(OsgiPlugin.java:400)

这导致了在pom.xmlinstructions 部分向Import-Package 添加排除项以修复未解决的约束。我最终走到了尽头,然后还将依赖项更改为:

<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j</artifactId>
    <version>3.3.2</version>
    <exclusions>
        <exclusion>
            <artifactId>*</artifactId>
            <groupId>*</groupId>
        </exclusion>
    </exclusions>
</dependency>

这导致插件成功部署,但无法在代码中实际使用 docx4j 而不会出错。这就是我现在所处的位置。

我的问题是,有没有人有将 docx4j 与 JIRA 插件集成的经验或知道如何解决这些问题?

我正在使用 docx4j 版本 3.3.2 和 JIRA 7.1.7。

【问题讨论】:

  • 如果您只更改 POM 而不进行其他操作(即没有代码更改?),是否会发生此错误?在您的 pom.xml 中,找到 JIRA/Maven 配置部分(在&lt;build&gt;&lt;plugins&gt;&lt;plugin&gt;&lt;groupId&gt;com.atlassian.maven.plugins&lt;/groupId&gt; &lt;artifactId&gt;maven-jira-plugin&lt;/artifactId&gt; ... &lt;configuration&gt; 下)并添加一个新的配置项:&lt;extractDependencies&gt;false&lt;/extractDependencies&gt;。之后,删除target 目录,重建并重新加载你的插件。它有效吗?顺便说一句,在你的 dep 上放置一个明确的 &lt;scope&gt;compile&lt;/scope&gt; 永远不会有什么坏处,即使这是默认设置。
  • 我尝试添加&lt;extractDependencies&gt;标签,但仍然导致部署错误。如果更改了 POM 并且代码不存在,仍然会出现部署错误。
  • 奇怪的是,仅更改 pom 就会产生这种影响,因为 OSGi 导入错误通常不应取决于与它一起打包为库的内容。你能:1- 核对目标目录,从 pom 中删除 dep,构建 jar 并保存副本。 2-添加回dep,重复所有前面的步骤,构建另一个jar。之后,您可以提取两个罐子并区分内容吗?您应该会在 META-INF/lib 中看到一些新的 jar,但在更改方面没有太多其他内容。

标签: java maven jira docx4j jira-plugin


【解决方案1】:

最后,是的。

    <dependencies>
        <dependency>
            <groupId>com.googlecode.jaxb-namespaceprefixmapper-interfaces</groupId>
            <artifactId>JAXBNamespacePrefixMapper</artifactId>
            <version>2.2.4</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>2.2</version>
        </dependency>

        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j</artifactId>
            <version>6.1.2</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.woodstox</groupId>
            <artifactId>woodstox-core</artifactId>
            <version>5.0.2</version>
        </dependency>


        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
            <!--that provided REALLY matters-->
        </dependency>


        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.1.3</version>
            <scope>provided</scope>
            <!--along with that-->
        </dependency>
    </dependencies>

和导入包:

<!-- Add package import here -->
<Import-Package>
    org.springframework.osgi.*;version="0";resolution:=optional,
    org.eclipse.gemini.blueprint.*;resolution:="optional",
    org.docx4j*;resolution:="required",
    javax.ws.rs*;resolution:="required",
    javax.xml.bind*;resolution:="required",
    *;version="0";resolution:="optional"
</Import-Package>

而且用法应该是这样的:

ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());
try{
    //...different docx4j things
}finally{
    Thread.currentThread().setContextClassLoader(currentClassLoader);
}

另外(现在不知道它是否重要,很确定它不重要),docx4j jar 也被添加到 JIRA 的 /lib 目录中。问题是 docx4j 和 JIRA 的内部 javax.xml 之间存在冲突 - 我已经尝试了新的纯 JIRA 插件,只包含 docx4j 的功能 - 只管理绝对需要的依赖项

对于原始答案来说当然为时已晚,但我希望这可能对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2017-08-28
    • 2017-08-12
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2016-10-24
    • 2014-05-23
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多