поставщик услуг и проблема OSGI - PullRequest
1 голос
/ 05 января 2012

Я написал пакет osgi, в котором у меня есть зависимость для jar (bsf-all.jar), который содержит поставщика услуг следующим образом (в META_inf / services /);

bsh.engine.BshScriptEngineFactory
com.sun.script.freemarker.FreeMarkerScriptEngineFactory
com.sun.script.groovy.GroovyScriptEngineFactory
com.sun.script.jacl.JaclScriptEngineFactory
com.sun.script.jaskell.JaskellScriptEngineFactory
com.sun.script.java.JavaScriptEngineFactory
com.sun.phobos.script.javascript.RhinoScriptEngineFactory
com.sun.phobos.script.javascript.EmbeddedRhinoScriptEngineFactory
com.sun.script.jawk.JawkScriptEngineFactory
com.sun.script.jelly.JellyScriptEngineFactory
com.sun.script.jep.JepScriptEngineFactory
com.sun.script.jexl.JexlScriptEngineFactory
com.sun.script.jruby.JRubyScriptEngineFactory
com.sun.script.judo.JudoScriptEngineFactory
com.sun.script.juel.JuelScriptEngineFactory
com.sun.script.jython.JythonScriptEngineFactory
com.sun.script.ognl.OgnlScriptEngineFactory
org.pnuts.scriptapi.PnutsScriptEngineFactory
com.sun.script.scheme.SchemeScriptEngineFactory
com.sun.script.velocity.VelocityScriptEngineFactory
com.sun.script.xpath.XPathScriptEngineFactory
com.sun.script.xslt.XSLTScriptEngineFactory

Когда я проверяю состояние своего пакета через консоль OSGI, он активен, и никаких проблем с зависимостями нет. Но когда я пытаюсь использовать его (значит, после того, как сервер запущен и работает) сервер выдает ошибку "Class not found";

java.lang.ClassNotFoundException: com.sun.phobos.script.javascript.RhinoScriptEngineFactory

Этот конкретный класс находится в моем банке зависимостей (bsf-all.jar), и этот класс предоставляется через поставщика услуг. Я подозреваю, что есть проблема загрузки класса с OSGi и поставщиком услуг Java.

Мой pom.xml выглядит следующим образом;

<dependencies>
        <dependency>
            <groupId>org.apache.bsf</groupId>
            <artifactId>bsf-all</artifactId>
            <version>${bsf.version}</version>
            <optional>true</optional>
        </dependency>
    <dependency>
            <groupId>rhino</groupId>
            <artifactId>js</artifactId>
            <version>1.6R7</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>

                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Bundle-Name>${project.artifactId}</Bundle-Name>
                        <Export-Package>
                            org.apache.bsf.*,
                            org.mozilla.javascript.*,
                            org.pnuts.scriptapi.*,
                            com.sun.script.*,
                            com.sun.phobos.script.*,
                            bsh.engine.*,
                            javax.script.*,
                        </Export-Package>
                        <Import-Package>
                          com.sun.*                          
                        </Import-Package>
            <DynamicImport-Package>*</DynamicImport-Package>
            <Embed-Dependency>js;scope=compile|runtime;inline=false;</Embed-Dependency>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

Я использую Equinox OSGi. Как мне отредактировать pom, чтобы преодолеть вышеуказанную проблему?

1 Ответ

4 голосов
/ 06 января 2012

Я чувствую, что в этом POM слишком много фундаментальных ошибок, чтобы начать рассуждать о причине CNFE. Ваше заявление <Export-Package> вызывает наибольшую обеспокоенность. Почему вы переупаковываете и экспортируете весь комплект BSF, Rhino, Phobos и даже части JDK внутри своего пакета ??

Как я и подразумевал в своем ответе на ваш предыдущий вопрос: вы увязли в деталях низкого уровня, не имея, я думаю, хорошего понимания того, чего вы пытаетесь достичь на высоком уровне. Поэтому, даже если кто-то отправит ответ, который поможет вам решить эту конкретную проблему, у вас все равно не будет рабочей архитектуры.

Пожалуйста, отойдите и опишите на высоком уровне, чего вы пытаетесь достичь и почему. Тогда мы можем предложить решение, основанное на хороших практиках OSGi.

...