Eclipse RCP (4.3) приложение с использованием maven

 
   

Итак. Намедни потребовалось создать eclipse rcp приложение на платформе Kepler. Положение осложнялось тем, что сборку надо было проводить с использованием maven’а. Ввиду того, что платформа kepler (4.3) достаточно новая и в ней было много всего переделано, информации по ней – кот наплакал. Поэтому пришлось подключать лом и чью-то матерь. Но в итоге все получилось. Методику этого получилось я и постараюсь описать тут.

Начнем с того, что у Вас должен быть установлен eclipse последней версии, в нем должен быть настроен maven и инструменты для разработки eclipse rcp. Я использовал для этого Spring ToolSuite, в котором мавен уже есть из коробки, а eclipse rcp tools легко ставятся через Install New Software. Методику этого всего я тут описывать не буду – материала навалом даже на русском языке.

Для начала создадим родительский проект для мавена – File > New > Maven Project.

file new maven project

Затем настроим основные вещи

basic setup

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

<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/xsd/maven-4.0.0.xsd" >

    <modelVersion>4.0.0</modelVersion>
    <groupId>ru.mrdekk.ercp</groupId>
    <artifactId>ru.mrdekk.ercp.parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>mrdekk.ru eclipse rcp demo - parent</name>

</project>

Для дальнейшего прогресса необходимо добавить некоторые вещи. Для начала – настройки, пока только версия tycho – инструмента для сборки rcp проектов maven’ом. Все это добавляем в pom.xml:

    <properties>
        <tycho-version>0.18.1</tycho-version>
    </properties>

Теперь добавим репозиторий eclipse rcp который нужен будет maven’у и tycho для получения артефактов:

     <repositories>
        <repository>
            <id>eclipse-platform</id>
            <layout>p2</layout>
            <url>http://download.eclipse.org/eclipse/updates/4.3/R-4.3-201306052000</url>
        </repository>
    </repositories>

Добавляем maven’овский плагин tycho в сборку:

     <build>
        <plugins>

            <plugin>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>tycho-maven-plugin</artifactId>
                <version>${tycho-version}</version>
                <extensions>true</extensions>
            </plugin>

        </plugins>
    </build>

C родительским проектом пока все, теперь создаем непосредственно проект eclipse rcp – File > New > Project … > Eclipse 4 > Eclipse 4 Application Project:

new eclipse rcp project

new eclipse rcp project

new eclipse rcp project

new eclipse rcp project

Запустим приложение для проверки работоспособности, для этого:

  1. Открываем файл определения продукта – ru.mrdekk.ercp.gui.product
  2. На вкладке «Overview» нажмите «Launch an Eclipse application».

Вы должны увидеть примерно следующее:

rcp sample launch

Теперь преобразуем проект в maven’овский проект. Для этого нажимаем правой кнопкой мыши на проекте и выбираем Configure > Convert to Maven Project. Появится следующее окошко, в нем вбиваем нужные данные. Внимание! Важно чтобы эти данные совпадали с тем, что Вы ввели когда создавали проект, т.е.

MANIFEST/Bundle-SymbolicName == POM/artifactId

и

MANIFEST/.qualifier == POM/-SNAPSHOT!

convert to maven

Eclipse будет ругаться на полученный pom, т.к. он не увидит tycho. Чтобы все получилось, необходимо указать ссылку на созданный нами родительский проект, Ваш pom.xml должен выглядеть примерно следующим образом:

<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/xsd/maven-4.0.0.xsd" >

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>ru.mrdekk.ercp</groupId>
        <artifactId>ru.mrdekk.ercp.parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>..</relativePath>
    </parent>

    <artifactId>ru.mrdekk.ercp.gui</artifactId>

    <packaging>eclipse-plugin</packaging>
    <name>mrdekk.ru eclipse rcp demo - gui</name>

</project>

Дальше на проекте ru.mrdekk.ercp.gui нажимаем правой кнопкой и Maven > Update Project …

Надо кроме того добавить проект ru.mrdekk.ercp.gui как модуль основного (родительского проекта), для этого в pom.xml родительского проекта добавляем:

    <modules>
        <module>gui</module>
    </modules>

Далее на проекте ru.mrdekk.ercp.parent нажимаем правой кнопкой и Run As > Maven build … Указываем цели «clean package» и нажимаем Apply, затем Run.

rcp launch configuration

Все должно нормально собраться:

[INFO] Reactor Summary:
[INFO]
[INFO] mrdekk.ru eclipse rcp demo - parent ............... SUCCESS [0.109s]
[INFO] mrdekk.ru eclipse rcp demo - gui .................. SUCCESS [2.860s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.797s
[INFO] Finished at: Mon Sep 23 11:02:05 NOVST 2013
[INFO] Final Memory: 14M/34M
[INFO] ------------------------------------------------------------------------

В следующих статьях расскажу что делать дальше. Мы соберем feature и update site, что позволит нам публиковать приложения для установки в eclipse и распространять бинарные билды.

Для референсов исходники проекта доступны на github’е вот тут.

Мысли вслух

 

Давно я сюда уже ничего постоянно не писал, видимо стоит возобновить практику. В последнее время по долгу службы приходится работать с языком Java в области Enterprise приложений. Можно говорить много слов об этом, но я сейчас не об этом. Для Java есть замечательный Spring Framework, который позволяет сосредоточиться на проблеме, а не на вспомогательных вещах, которые кочуют из проекта в проект.

Так как я сам лично люблю С++, то попытался я поискать чего нибудь подобного для этого языка. И не нашел. Причем по отдельности, по разной функциональности есть готовые разработки и библиотеки, есть даже в Open Source, однако чего-то целостного я не нашел. Может быть кто в курсе? Или С++ настолько непопулярен для разработки такого рода приложений?…

Впрочем, увидим…

Устанавливаем C++ драйвер для MongoDB на Mac OS X Mountain Lion

 
 

Потребовался мне вдруг С++ драйвер для MongoDB на Mac OS X, так как писать для FreeBSD софт на С++ лучше всего под Mac OS X в xCode, вот такой уж винегрет.

Поэтому, первое что делаем, качаем вот отсюдова вот файлик с названием cxx-driver/mongodb-linux-x86_64-latest.tgz пофигу что linux – скомпиляем и так, ведь для Mac OS X специально нету :( а жаль.

Распаковываем, и идем в распакованную папку, пытаемся сделать

$ scons

Но вот блин, scons’а нет на маке, увы :(

Ладно, качаем его отсюдова вот

и дальше

$ python setup.py install

Возвращаемся в папку с распакованным драйвером MongoDB, и пытаемся снова сделать

$ scons

Веселье продолжается – на маке не установлен Boost, отлично идем и качаем исходники отсюдова вот

Как скачалось распаковываем и идем в распакованную папку и делаем

$ ./bootstrap.sh
$ ./b2
$ sudo ./b2 install

Алилуйя! Возвращаемся в папку с распакованным драйвером и снова делаем

$ scons
$ sudo scons install

И вуаля – теперь у нас есть MongoDB C++ драйвер для Mac OS X Mountain Lion

Комментарии со старой версии блога

Артем: 18.07.2013 в 20:33 Спасибо большое. Установить получилось ) но tutorial.cpp так и не получилось запустить. Выдает:

tutorial.cpp:3:35: error: mongo/client/dbclient.h: No such file or directory

Может подскажете, почему такое получается ?


MrDekk: 18.07.2013 в 20:37 Добрый день! Попробую подсказать. Компилируете чем? Если xcode, то надо в настройках проекта установить Header Search Paths туда где у вас стоит mongo (у меня например такой путь получился – /usr/local/include). Также не забудьте прописать в Other Linker Flags параметр -lmongoclient чтобы после компиляции у Вас все слинковалось.

Ежели компиляете руками (make, gmake и иже с ними), то -I/usr/local/include -lmongoclient

Ежели не получится – отпишитесь по симптомам.


Артем: 18.07.2013 в 21:11 Решил переустановить драйвер. При запуске:

$ scons

в конце получил вот такое:

In file included from src/mongo/logger/ramlog.cpp:20:
src/mongo/logger/ramlog.h:154: error: ISO C++ forbids declaration of ‘lock_guard’ with no type
src/mongo/logger/ramlog.h:154: error: invalid use of ‘::’
src/mongo/logger/ramlog.h:154: error: expected ‘;’ before » token
src/mongo/logger/ramlog.cpp:49: error: ‘lk’ was not declared in this scope
src/mongo/logger/ramlog.cpp: In constructor ‘mongo::RamLog::LineIterator::LineIterator(mongo::RamLog*)’:
src/mongo/logger/ramlog.cpp:174: error: class ‘mongo::RamLog::LineIterator’ does not have any field named ‘_lock’
scons: *** [build/mongo/logger/ramlog.o] Error 1
scons: building terminated because of errors.

p.s. В /usr/local/include пусто (


Артем: 18.07.2013 в 21:39 Нашел mongo в /opt/local/include/ Подключил так как вы описали. Теперь получаю вот такое:

/opt/local/include/mongo/pch.h:48:10: ‘boost/shared_ptr.hpp’ file not found

этот путь тоже нужно подключить так ?


MrDekk: 18.07.2013 в 22:26 ну boost тоже надо подключать, тем же способом


Артем: 19.07.2013 в 14:01 Добавил вот такое:

/opt/local/include/** /usr/local/include/boost/** /usr/local/include/boost/tr1/detail/**

Но по прежнему ругается на

/usr/local/include/boost/tr1/tr1/iostream:16:12: ‘boost/tr1/detail/config_all.hpp’ file not found

MrDekk: 21.07.2013 в 13:43 А можно iostream этот в студию? Может быть вместо

/usr/local/include/boost/tr1/detail

надо указать

/usr/local/include/boost/tr1

Поиск подстроки в файлах на сервере FreeBSD

Ок, чтобы долго не бегать, сразу дам ответ на вопрос «Как найти строку во всех файлах в текущей папке»:

$ find $PWD -name '*.*' -exec grep -l "TEST" {} \;

Использовать по протоколу ssh, $PWD указывает на текущую директорию (можно посмотреть путь командой pwd).

Параметр -name ‘.’ указывает что идёт поиск всех файлов по маске .. К этим файлам выполняем (-exec) команду grep, которая ищет строку TEST в списке файлов и (можете изменять на свою, не забывайте только экранировать некоторые символы, например кавычки) и выводит список всех файлов (-l).

Взято отсюда

Получения хэша ключа для Facebook

   

Для реализации интеграции с Facebook необходим хэш ключа, чтобы его сделать, надо пойти туда, где этот ключ лежит и сделать

$ keytool -exportcert -keystore mygame.keystore | openssl sha1 -binary | openssl base64