मैं Apache POI को OSGi बंडल में काम करने की कोशिश कर रही दीवार के खिलाफ अपना सिर पीट रहा हूं। यहाँ इतिहास है जो मैंने बिना किसी भाग्य के कोशिश की है:

1) मैंने शुरू में पूर्व लिपटे अपाचे सर्विसिकिक्स पीओआई बंडल का उपयोग करने की कोशिश की थी। हालाँकि इसकी कई निर्भरताएँ थीं जिन्हें मुझे तैनात करना था, जिनमें से कई की आवश्यकता नहीं थी। मैंने अपाचे POI सर्विसिक (और इसकी निर्भरता) को जोड़ने के बाद भी एक दीवार को मारा, मुझे अभी भी लापता वर्गों के साथ समस्या मिल रही थी।

2) पहले समाधान में अनावश्यक सामान की मात्रा के कारण, मैंने एक बंडल के अंदर निर्भरता को लपेटने का फैसला किया। मूल रूप से मेरे पास एक ब्लूप्रिंट सेवा है जो POI कार्यक्षमता के लिए एक आवरण के रूप में कार्य करती है। सभी यूनिट परीक्षण ठीक काम करते हैं लेकिन मेरे पैक्स परीक्षा परीक्षण विफल हो रहे थे।

सबसे पहले, यह उन कक्षाओं को नहीं खोज सका जो निर्भरता (कॉमन्स-कोडेक, xmlbeans, आदि) थे। इसलिए मैंने पीओआई और पीओआई ओओएमएक्सएल निर्भरता और इसके लिए आवश्यक अन्य सभी निर्भरता को जोड़ा। इसने अधिकांश क्लास लोडर मुद्दों को हल किया। हालाँकि यह वह है जिस पर मैं वर्तमान में अटका हुआ हूँ। बंडल ठीक शुरू होता है, लेकिन एक बार जब यह एक बिंदु से टकराता है, जहां यह एक्सेल वर्कबुक बनाने की कोशिश करता है, तो यह निम्नलिखित स्टैक ट्रेस के साथ विफल होता है:

java.lang.ClassNotFoundException: com.bea.xml.stream.EventFactory not found by org.ops4j.pax.exam.rbc [104]

at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:68)
at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:178)
at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
at javax.xml.stream.XMLEventFactory.newInstance(XMLEventFactory.java:30)

यहां मैं निर्भरताएं शामिल कर रहा हूं:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>${apache.poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${apache.poi.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>2.6.0</version>
        </dependency>

ऐसा लगता है कि पैक्स कंटेनर को EventFactory नहीं मिल रहा है। अगर किसी के पास कोई सुझाव है तो मैं मदद की बहुत सराहना करूंगा।

0
Frank Reno 3 पद 2015, 20:41

3 जवाब

सबसे बढ़िया उत्तर

यहाँ एक काम कर रहे POI ओस्गी बंडल के लिए pom.xml है जो XLSX निर्यात बनाने के लिए उपयोग किया जाता है। हो सकता है कि कुछ विदेशी सुविधा वैकल्पिक आयात के कारण 100% प्रतिशत समर्थित नहीं हैं, लेकिन यह मानक निर्यात के लिए काम करता है।

अपाचे कॉमन्स बंडलों ओस्गी आज्ञाकारी हैं, इसलिए यदि आप इन निर्भरता के साथ उपयोग कर रहे हैं तो यह काम करना होगा (कुछ कॉमन्स का उपयोग अन्य सुविधाओं द्वारा किया जाता है, इसलिए सभी की आवश्यकता नहीं है)। सुविधाएँ हमारे karaf फ़ीचर फ़ाइल में हैं, लेकिन आप किसी भी OSGi कंटेनर में दिए गए मावेन मूल से बंडलों का उपयोग कर सकते हैं।

<feature name="stax" version="2.4.0">
    <bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.stax-api-1.0/2.4.0</bundle>
    <bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jaxb-api-2.2/2.4.0</bundle>
</feature>  

<feature name="repo-apache-commons" version="1.0.0">
    <bundle>mvn:commons-beanutils/commons-beanutils/1.9.2</bundle>
    <bundle>mvn:commons-collections/commons-collections/3.2.1</bundle>
    <bundle>mvn:commons-io/commons-io/2.4</bundle>
    <bundle>mvn:org.apache.commons/commons-pool2/2.4.2</bundle>
    <bundle>mvn:org.apache.commons/commons-dbcp2/2.1.1</bundle>
    <bundle>mvn:commons-codec/commons-codec/1.9</bundle>
</feature>

<feature name="repo-bouncycastle" version="1.46">
    <bundle>mvn:org.bouncycastle/bcprov-jdk16/1.46</bundle>
    <bundle>mvn:org.bouncycastle/bcmail-jdk16/1.46</bundle>
    <bundle>mvn:org.bouncycastle/bctsp-jdk16/1.46</bundle>
</feature> 

Pom.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<version>3.13.1</version>

<properties>
    <poi.version>3.13</poi.version>
    <poi.schema.version>1.1</poi.schema.version>
    <poi.security.version>1.0</poi.security.version>
</properties>

<groupId>org.yourgroupid</groupId>
<artifactId>osgi-apache-poi</artifactId>
<packaging>bundle</packaging>
<name>osgi-apache-poi</name>
<description>Apache poi framework</description>

<build>
<plugins>

    <plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
        <instructions>
                    <_exportcontents>
                        org.apache.poi.*;version=${poi.version},
                        org.openxmlformats.schemas.*;version=${poi.schema.version},
                        schemasMicrosoftComOfficeExcel.*;version=${poi.schema.version},
                        schemasMicrosoftComOfficeOffice.*;version=${poi.schema.version},
                        schemasMicrosoftComOfficePowerpoint.*;version=${poi.schema.version},
                        schemasMicrosoftComVml.*;version=${poi.schema.version},
                        org.etsi.uri.*;version=${poi.security.version}
                    </_exportcontents>
                    <Import-Package>
                        com.sun.javadoc;resolution:=optional,
                        com.sun.tools.javadoc;resolution:=optional,
                        org.apache.crimson.jaxp;resolution:=optional,
                        org.apache.tools.ant;resolution:=optional,
                        org.apache.tools.ant.taskdefs;resolution:=optional,
                        org.apache.tools.ant.types;resolution:=optional,
                        junit.framework.*;resolution:=optional,
                        junit.textui.*;resolution:=optional,
                        org.junit.*;resolution:=optional,
                        org.apache.xml.security.*;resolution:=optional,
                        org.apache.jcp.xml.dsig.internal.dom.*;resolution:=optional,
                        *
                    </Import-Package>
                    <DynamicImport-Package>
                        org.apache.xmlbeans.*,
                        schemaorg_apache_xmlbeans.*
                    </DynamicImport-Package>

        <!-- bundle supplied resource prefixes -->
        <Include-Resource>{maven-resources}</Include-Resource>

        <!-- Do not inline jars, include as jar files -->
        <!-- There are config files with same name will be overwritten -->
        <Embed-Dependency>*;scope=compile;inline=false</Embed-Dependency>


        </instructions>
    </configuration>
    </plugin>
</plugins>
</build>
<dependencies>
    <!-- Embedded dependencies -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>${poi.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>${poi.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>${poi.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>${poi.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>ooxml-schemas</artifactId>
        <version>${poi.schema.version}</version>
    </dependency>
    <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>ooxml-security</artifactId>
       <version>${poi.security.version}</version>
    </dependency>
</dependencies>
1
Csákány Róbert 3 पद 2015, 23:03

इसे जोड़ने का प्रयास करें, यह मेरे लिए काम करता है

<dependency>
   <groupId>stax</groupId>
   <artifactId>stax-api</artifactId>
   <version>1.0.1</version>
</dependency>

<dependency>
   <groupId>stax</groupId>
   <artifactId>stax</artifactId>
   <version>1.2.0</version>
</dependency>

मावेन बंडल प्लगइन स्वचालित रूप से निर्भरता के धब्बे को नहीं पा सकता है: सन: 1.2.0, इसके अलावा आपको मैन्युअल रूप से पैकेज com.bea को निर्यात करने की आवश्यकता हो सकती है। *

नीचे bs

Osgi-fied apache.poi के लिए अपना बंडल और रेपो बनाने के लिए ./gradlew clean bundles updateSite चलाएं

-1
user29131 6 अप्रैल 2017, 16:13

उपरोक्त उत्तर के अलावा मैंने अपनी समस्या का भी पता लगाया। डिबग करने के लिए यूनिट टेस्ट चलाने के बजाय, मैंने निर्मित कराफ इंस्टैक्स पैक्स शुरू किया। लॉग में अधिक tidbits थी जो मुझे लापता पैकेज आयातों की ओर इशारा करती थी। एक बार जब मैंने लापता आयात को जोड़ा तो मूल त्रुटि चली गई।

0
Frank Reno 3 पद 2015, 23:23