Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание плагина к Eclipse с использованием Spring, сборка с помощью Maven 
V
    Опции темы
Prof_2000
  Дата 25.3.2011, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 26.3.2005
Где: Харьков, Украина

Репутация: нет
Всего: 1



Добрый день!

В рамках работы над дипломом возникла следующая необходимость - разработать плагин к IDE Eclipse для сбора разнообразной информации о процессе работы с использованием интеграционного фреймворка Apache Camel. У него есть несколько способов настройки, но самый удобный - через Spring и его context.xml . Проект многомодульный, поэтому хочется использовать Apache Maven для сборки. При этом, к сожалению, опыта работы с OSGi - совсем немного.

Нашел 2 принципиальных способа реализации задуманного:
maven-bundle-plugin
- com.springsource.bundlor

По описанию понравился первый вариант, и я стал пробовать прикрутить его

С миру по нитке была собрана вот такая конфигурация:
Код

            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.4</version>
                <extensions>true</extensions>
                <configuration>
                    <manifestLocation>META-INF</manifestLocation>
                    <ignoreMissingArtifacts>true</ignoreMissingArtifacts>
                    <instructions>
                        <Bundle-SymbolicName>${bundle.symbolicName}; singleton:=true</Bundle-SymbolicName>
                        <Bundle-Version>${pom.version}</Bundle-Version>
                        <!-- | assume public classes are in the top package, and private classes 
                            are under ".internal" -->
                            
                        <Export-Package>!${bundle.namespace}.internal.*,${bundle.namespace}.*;version="${pom.version}"</Export-Package>
                        <Private-Package>${bundle.namespace}.internal.*</Private-Package>
                        
                        <Import-Package>.,*;resolution:=optional</Import-Package>


                        <Bundle-Activator>${bundle.namespace}.Activator</Bundle-Activator>
                        <Bundle-ActivationPolicy>lazy</Bundle-ActivationPolicy>
                        <Require-Bundle>org.eclipse.ui,org.eclipse.core.runtime</Require-Bundle>
                        <Bundle-RequiredExecutionEnvironment>JavaSE-1.6</Bundle-RequiredExecutionEnvironment>

                        <Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
                        <Embed-Directory>target/dependency</Embed-Directory>
                        <Embed-StripGroup>true</Embed-StripGroup>
                        <Embed-Transitive>true</Embed-Transitive>
                    </instructions>
                </configuration>
            </plugin>


В результате - архив собирается таким, каким я хотел бы его видеть:
Код

-target
-+dependency
+org
+META-INF
plugin.xml
...


 MANIFEST.MF - тоже похож на верный:
в Bundle-Classpath автоматически прописываются все зависимости из pom.xml
Код

Bundle-ClassPath: .,target/dependency/commons-management-1.0.jar,targe
 t/dependency/org.osgi.core-4.1.0.jar, ...

В Import-Package все (казалось бы) зависимости раскрываются из *;resolution:=optional в нечто вроде:
Код

Import-Package: .,bsh;resolution:=optional,com.ibm.wsspi.uow;resolutio
 n:=optional,com.jamonapi;resolution:=optional, ...


Но для работоспособности плагина этого недостаточно. При запуске Eclipse с этим плагином - получается ошибка java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext . В target/dependency архив spring-context-3.0.5-RELEASE.jar лежит, в Bundle-Classpath прописан. Правда, этого пакета действительно нету в списке Import-Package.

Если его туда насильно добавить - будет ошибка валидации (No available bundle exports package 'org.springframework.context') и плагин не активируется вообще. Притом, в этом случае такое сообщение вылазит не только про org.springframework.context, а еще для около 30 разных других пакетов, вообще никак не связанных с org.springframework.context, и даже с проектом вообще (например, org.apache.wicket)

Код

No available bundle exports package 'org.apache.wicket'
No available bundle exports package 'org.codehaus.groovy.control'
No available bundle exports package 'org.codehaus.jettison.mapped'
No available bundle exports package 'org.hibernate.validator.messageinterpolation'
No available bundle exports package 'javax.validation.spi'
No available bundle exports package 'org.apache.avalon.framework.logger'
No available bundle exports package 'org.apache.derby.jdbc'
No available bundle exports package 'javax.resource.spi.endpoint'
No available bundle exports package 'javax.interceptor'
No available bundle exports package 'com.thoughtworks.qdox'
No available bundle exports package 'edu.emory.mathcs.backport.java.util.concurrent'
No available bundle exports package 'groovy.lang'
No available bundle exports package 'com.ibm.wsspi.uow'
No available bundle exports package 'org.springframework.context'
No available bundle exports package 'org.objectweb.howl.log'
No available bundle exports package 'org.jruby.javasupport'
No available bundle exports package 'org.jruby.ast'
No available bundle exports package 'org.springframework.web.context.support'
No available bundle exports package 'org.springframework.security.authentication.encoding'
No available bundle exports package 'org.springframework.security.providers.encoding'
No available bundle exports package 'org.springframework.oxm'


В чем дело, я не могу самостоятельно разобраться уже несколько дней. Судя по всему, проблема в основном в моем непонимании OSGi (Camel тут вроде ни при чем, сам Spring и Maven тоже достаточно боком касаются).  Если у кого-то есть хоть какие идеи, насчет того, в какую сторону копать - пожалуйста, помогите. 

Вариант с использованием Spring bundlor я не рассматривал, но если есть кто-то, кто работал именно с ним - и сможет направить на путь истинный - конечно рассмотрю.  smile 


Это сообщение отредактировал(а) Prof_2000 - 25.3.2011, 18:24
--------------------
Pereant qui ante nos nostra dixerunt! (лат.)      Да погибнут те, кто раньше нас высказал наши мысли!   
PM MAIL WWW ICQ   Вверх
COVD
Дата 25.3.2011, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



В IDE Netbeans есть заготовка проекта OSGi bundle. Как раз то, что вы начали делать - Мавен, Феликс. Наверное, вы работаете с IDE Eclipse. Может, там тоже есть готовый шаблон? Логично же начать с IDE Eclipse, раз плагин для него создается.   
PM MAIL   Вверх
Prof_2000
Дата 25.3.2011, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 26.3.2005
Где: Харьков, Украина

Репутация: нет
Всего: 1



Да, вы правы, я действительно работаю в IDE Eclipse. Как таковой заготовки не нашлось, попробовал несколько maven archetypes - по сути то же самое - создается проект, с заготовкой OSGi (есть даже spring-osgi-bundle-archetype). 

Эта штуковина создает просто заготовку под OSGi - не Eclipse плагин. Пытаюсь упростить себе задачу как могу - из этой заготовки хочу сделать плагин типа HelloWorld(чтобы взял зависимость через Spring-овый bundle-context.xml и вывел в консоль). Для этого добавил туда Activator, прописал некоторые дополнительные аттрибуты в MANIFEST - пришел к похожей проблеме.

Суть:
Если не прописывавать внедрение зависимостей из pom.xml
Код

<Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
<Embed-Directory>target/dependency</Embed-Directory>
<Embed-StripGroup>true</Embed-StripGroup>
<Embed-Transitive>true</Embed-Transitive>


То Import-Package достаточно компактно, там указан org.springframework.context, но вылазит ошибка "No available bundle exports package 'org.springframework.context'" (неудивительно, в собранном архиве плагина нет зависимостей типа spring-context-3.0.5-RELEASE.jar)

Если в pom.xml добавить <Embed-Dependency> и.т.п - то Import-Package разрастается до невероятных размеров (там перечислены все транзитивные зависимости), причем самого org.springframework.context там уже нет. Плагин всё равно не запускается, ругань похожая - при запуске жалуется 
на отстутствие десятка пакетов, которые по сути не нужны (помечены как resolution=optional)

Да и еще насчет шаблона в IDE - в идеале, процесс сборки ведь не должен зависеть от IDE. Но сейчас меня, конечно, устроило бы любое работоспособное решение.

Может, кто-нибудь знает хотя бы какой-нибудь OpenSource плагинчик к Eclipse, чтоб внутри себя Spring использовал?
--------------------
Pereant qui ante nos nostra dixerunt! (лат.)      Да погибнут те, кто раньше нас высказал наши мысли!   
PM MAIL WWW ICQ   Вверх
COVD
Дата 25.3.2011, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Первое, что попалось на глаза для эклипса:
Your first OSGi bundle
PM MAIL   Вверх
Prof_2000
Дата 25.3.2011, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 26.3.2005
Где: Харьков, Украина

Репутация: нет
Всего: 1



Спасибо, но это не совсем то. Точнее - это просто инструкция по созданию плагинов как таковых. 

В этой инструкции немного сказано про управление зависимостями - лишь то, что для доступа к классам из других bundle надо их добавлять в Import-Package.

У меня же ситуация следующая: я хочу jar-файлы зависимостей (типа тот же Spring) сложить прямо к себе в архив с плагином. И это даже удается для простеньких архивов без транзитивных зависимостей (Embed-Dependoncy и.т.д.). 

 А в случае со Спрингом - там столько разных нюансов, что я, видимо, уже просто запутался. Собственно, из-за громоздкости Спринга я и начал возиться с Maven (иначе пару jar-файлов можно было и вручную прописать в MANIFEST.MF)

Это сообщение отредактировал(а) Prof_2000 - 25.3.2011, 19:50
--------------------
Pereant qui ante nos nostra dixerunt! (лат.)      Да погибнут те, кто раньше нас высказал наши мысли!   
PM MAIL WWW ICQ   Вверх
Prof_2000
Дата 26.3.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 26.3.2005
Где: Харьков, Украина

Репутация: нет
Всего: 1



Я решил свою проблему. Суть заключалась в том, что для размещения просто использовался не тот архив, который собирался. В итоге - транзитивные зависимости не подтягивались.

Помогло добавление 
Код

            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>



Решение, безусловно, не идеально. Для Spring существуют специальные OSGi бандлы, Spring DM, здесь все эти преимущества теряются - все зависимости встраиваются в пакте плагина - он перестает быть модульным. Но этого решения может хватить на первое время для создания PoC. 

Для отладки запускаю из Eclipse PDE - для тестового запуска сейчас нужно проделать целый ряд почти магических манипуляций:
Код

mvn clean bundle:manifest
#в Eclipse - Clean Project + Build Project
mvn package
#в Eclipse - F5 (Refresh), Run/Debug


Спасибо COVD за участие. Если у кого-нибудь есть советы - буду по-прежнему рад их выслушать. Но вопрос, по сути, уже решен.
--------------------
Pereant qui ante nos nostra dixerunt! (лат.)      Да погибнут те, кто раньше нас высказал наши мысли!   
PM MAIL WWW ICQ   Вверх
COVD
Дата 26.3.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Prof_2000 , рад за вас. Но все же думаю, что есть для эклипса какой-то визард (или появится), который делает всю эту рутину с правкой MANIFEST, pom.xml и пр.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1439 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.