Как заставить все это работать: War, OSGI, Spring Beans, Maven

Попытка развернуть войну с bean-файлом в Fuse Servicemix (версия 4.3.1). Я использую maven для создания своей войны. Кажется, я не могу заставить это работать. Может ли кто-нибудь предоставить веб-сайт, который может сказать мне, как это сделать?

Этот веб-сайт говорит мне, что поместить в файл web.xml, но не объясняет остальное.

http://fusesource.com/docs/esbent/7.0/esb_deploy_osgi/BuildWar-Spring.html.

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

жирная война (РЕШЕНО):

Смотрите ответ ниже


тощая война:

Кажется невозможным в osgi. Необходимо вручную импортировать слишком много пакетов. Эта ссылка, кажется, решает ее, но, похоже, там много неприятных побочных эффектов.

http://davidvaleri.wordpress.com/2011/08/17/deploying-spring-mvc-based-web-applications-to-osgi-using-apache-servicemix/


person Thirlan    schedule 04.04.2013    source источник


Ответы (2)


Вам нужно добавить Spring OSGi ContextLoaderListener в ваш файл web.xml, иначе он не будет работать. Вам также понадобятся зависимости от Spring-DM 1.2.1. Взгляните на пример Pax Web Spring и особенно файл web.xml в нем. Это рабочий пример использования Spring в Karaf/Fuse-ServiceMix...

Наверное, я указал вам не на тот образец. Вам не нужно использовать следующее.

contextClass
org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext

person Achim Nierbeck    schedule 05.04.2013
comment
Ахим. Ссылка, которую я предоставил выше, говорит мне включить ContextLoaderListener, так что мне там хорошо. Взял твой пример и попробовал. Я удалил все элементы jsp и просто использовал простой файл web.xml с ContextLoaderListener и страницей приветствия index.html. Пакет загружается нормально, без ошибок. Но оператор печати в моих компонентах никогда не срабатывает. Добавление кода в исходный пост. - person Thirlan; 05.04.2013
comment
Ахим, это определенно пропускает мой файл бобов. Я удаленно отладил и добавил разрыв строки в файл println. Он никогда не выполняется. - person Thirlan; 05.04.2013
comment
Я исправил класс контекста, извините, это был неправильный образец. - person Achim Nierbeck; 06.04.2013
comment
Я попробовал еще несколько вещей и исследовал еще несколько вещей. Все еще не работает. Опубликовал мою текущую настройку выше. Страница index.html по-прежнему загружается нормально, и в журнале servicemix нет сообщений об ошибках. - person Thirlan; 20.04.2013
comment
Если это поможет, тот, который читает мой webxml, кажется, WebXmlObserver из org.ops4j.web.pax-web-extender-war - 0.7.4 - person Thirlan; 20.04.2013
comment
Embed-Directory был одним из последних штрихов, решивших мою проблему. - person Thirlan; 20.04.2013
comment
чувак, сколько лет твоей установке, Pax-Web теперь доступен в версии 2.1 и очень скоро будет выпущена версия 3.0.0. Может быть, ваша установка просто слишком старая? - person Achim Nierbeck; 20.04.2013
comment
servicemix 4.3.1 : ( Я поместил его вверху поста. Да, я знаю, корпоративный всегда сильно отстает и слишком боится обновляться. - person Thirlan; 21.04.2013
comment
Хорошо, я добавил образец Spring OSGI в pax web. Взгляните на github.com/ ops4j/org.ops4j.pax.web/tree/master/samples/ соответствующий тест находится по адресу github.com/ops4j/org.ops4j.pax .web/blob/мастер/ - person Achim Nierbeck; 21.04.2013

Решение жирной войны

Это минимально жизнеспособное решение, которое сработало для меня. Я играл, пытаясь удалить что-то, и он сломался, как только я это сделал, часто даже не отправляя сообщение об ошибке.


структура каталогов:

src/main/java/test/Test.java
src/main/webapp/WEB-INF/web.xml
src/main/webapp/WEB-INF/applicationContext.xml

пом.xml

...
    <groupId>test</groupId>
    <artifactId>war-bean-test</artifactId>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>3.0.5.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework.osgi</groupId>
          <artifactId>spring-osgi-web</artifactId>
          <version>1.2.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <executions>
                  <execution>
                    <id>bundle-manifest</id>
                    <phase>process-classes</phase>
                    <goals>
                      <goal>manifest</goal>
                    </goals>
                  </execution>
                </executions>
                <configuration>
                  <supportedProjectTypes>
                    <supportedProjectType>jar</supportedProjectType>
                    <supportedProjectType>bundle</supportedProjectType>
                    <supportedProjectType>war</supportedProjectType>
                  </supportedProjectTypes>
                  <instructions>
                    <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
                    <Bundle-Version>${project.version}</Bundle-Version>

                    <!-- IMPORTANT resolution:=optional fixes bug where bundle fails to load unnecessary packages such as bsh. You also need javax.servlet. In Servicemix 4.3.1 it is provided by geronimo servlet. -->
                    <Import-Package>
                        javax.servlet
                        *; resolution:=optional
                    </Import-Package>
                    <Export-Package></Export-Package>

                    <!-- IMPORTANT explicitly adding the jars fixes the numerous CassNotFoundExceptions -->
                    <Bundle-ClassPath>
                        .,WEB-INF/classes,{maven-dependencies}
                    </Bundle-ClassPath>
                    <Web-ContextPath>warbeantest</Web-ContextPath>
                    <Webapp-Context>warbeantest</Webapp-Context>

                    <!-- adding inline=true to Embed-Dependency causes {maven-dependencies} to not work and you will have to add every jar by hand -->
                    <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
                    <Embed-Transitive>true</Embed-Transitive>
                    <Embed-Directory>WEB-INF/lib</Embed-Directory>
                  </instructions>
                </configuration>
              </plugin>

              <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                  <archive>
                    <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
                  </archive>
                </configuration>
              </plugin>
        </plugins>
    </build>
</project>

файл web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
    <display-name>war-bean-test</display-name>
    <description>war-bean-test</description>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <!-- If you remove this then the spring beans will still work, but you wont be able to fetch services and resources from other osgi bundles -->
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="test" class="test.Test">
        <property name="value" value="1" />
    </bean>
</beans>

Тест.java

package test;
public class Test {
    private int value = 0;
    public TestImpl() { }

    public void setValue(int value) {
        // Should print to console when you load into Fuse Servicemix
        System.out.println("testing...");
        this.value = value;
    }

    public int getValue() { return value; }
}
person Thirlan    schedule 20.04.2013