SerialInitContextFactory не найден в именовании стеклянных рыб - PullRequest
4 голосов
/ 18 октября 2011

Это начинает сводить меня с ума ...

Я хочу создать клиентское приложение Glassfish с использованием Maven.

Для этого я добавил требуемую зависимость gf-client:

    <dependency>
        <groupId>org.glassfish.appclient</groupId>
        <artifactId>gf-client</artifactId>
        <version>3.1</version>
        <type>pom</type>
        <scope>compile</scope>
    </dependency>

Затем, желая связаться с моим сервером Glassfish, работающим в том же приложении, я делаю обычный поиск:

Properties p = new Properties();
// optional. Defaults to localhost. Only needed if web server is running
// on a different host than the appserver
p.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
// optional. Defaults to 3700. Only needed if target orb port is not
// 3700.
p.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
Context context = new InitialContext(p);
// Stores the list of reachable EJBs
return context.lookup(interfacesToNames.getProperty(className));

К сожалению, при этом все, что я получаю, это

Caused by: javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.impl.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com/sun/enterprise/naming/impl/SerialInitContextFactory]
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
        at javax.naming.InitialContext.init(InitialContext.java:242)
        at javax.naming.InitialContext.<init>(InitialContext.java:216)
        ... 6 more
Caused by: java.lang.ClassNotFoundException: com/sun/enterprise/naming/impl/SerialInitContextFactory
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:63)
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:671)
        ... 9 more

После некоторых проверок я заметил, что мой glassfish-naming-3.1.jar присутствует в CLASSPATH для этого клиентского приложения.И, согласно поиску кода Eclipse, именно этот jar должен содержать com.sun.enterprise.naming.impl.SerialInitContextFactory.Однако, если в режиме отладки я делаю getClass().getClassLoader().getResource("com/sun/enterprise/naming/impl/SerialInitContextFactory"), он возвращает мне ноль, что ясно указывает на то, что класс не может быть найден.

Для получения дополнительной информации JAR копируется из моего локального репозитория maven с использованием этогоКонфигурация плагина:

        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>package output directory</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <prependGroupId>true</prependGroupId>
                        <includeScope>compile</includeScope>
                        <outputDirectory>${dependencies.outputDir}/jars</outputDirectory>
                        <prefix>${dependencies.outputDir}</prefix>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Кроме того, я должен признаться, что при запуске простого теста с использованием того же API для подключения к серверу Glassfish абсолютно не возникает проблем, что наводит меня на проблему ClassLoader.

При запуске этого клиента текущий загрузчик классов (обозначается getClass().getClassLoader().getClass().getName()) sun.misc.Launcher$AppClassLoader.К сожалению, это точно то же самое, что и при запуске модульного тестирования.

Итак, что я могу сделать, чтобы устранить эту ошибку?

EDIT Класс существует в glassfish-naming-3.1.jar, нокажется, не может быть найден стандартным загрузчиком классов.

РЕДАКТИРОВАТЬ Интересное открытие:

getClass().getClassLoader().getResource("com/sun/enterprise/naming/impl") = jar:file:/C:/Users/pouet/pouet/target/jars/glassfish-naming-3.1.jar!/com/sun/enterprise/naming/impl

в то время как

getClass().getClassLoader().getResource("com/sun/enterprise/naming/impl/SerialInitContextFactory") = null

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Вы пробовали использовать ACC?Ваше решение кажется надуманным.

2 голосов
/ 18 октября 2011

По какой-то причине я не совсем понимаю, есть настроенный загрузчик классов Context при запуске в приложении.Этот загрузчик классов, похоже, использует какое-то ограничение именования OSGi.

Как следствие, чтобы избежать ошибки, я сбрасываю загрузчик класса контекста:

Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

И это сработало!

...