Help - Search - Members - Calendar
Full Version: Прихована загроза в maven-assembly-plugin
DEV UA > Java > Build Tools
TIGER
Недавно, читавши одну з книг, відкрив для себе maven-assembly-plugin.

Заадача була такою: є якась консольна утилітка (jar файлик), який потрібно запускати з командного рядка, і все б нічого, але ця утилітка має купу залежностей на інші jar Файли. Перечитувавши одну книгу, натрапив на чудовий підхід: додаємо до pom.xml в dependencies dependency на maven-assembly-plugin, потім пишемо в консолі команду: mvn assembly:assembly і після її успішного виконання отримуємо два jar файли - один звичайний, а другий під назвою <назва проекту>-jar-with-dependencies.jar, який містить всі класи із потрібних jar файлів. Даний файл буде запускатись незалежно, без інших jar файлів.

От і маємо щастя, якби не одне але...

Якщо потрібні jar файли містять деякі ресурсні файли, які потрібні для Вашої утилітки, причому файлик ресурсів з однаковою назвою та різним контентом міститься в різних jar файлах - то тут і вилазить приховане зло:

Даний плагін додає в файл <назва проекту>-jar-with-dependencies.jar перший ресурсний файл, а всі решта ігнорує(чи навпаки при зустрічі кожного такого файлу перезаписує його в файл <назва проекту>-jar-with-dependencies.jar) - не факт що в результаті отримаєте в джарці той файл, який очікувався.

От така от проблема.

В результаті я вирішив цю проблему наступним чином:

1) Використав плагін maven-dependency-plugin замість maven-assembly-plugin.
2) Запускаю команду: mvn clean dependency:copy-dependencies install.
3) Отримую classpath для проекту: mvn dependency:build-classpath
4) Додаю до параметрів запуску згенерований classpath.

Ось так.
Tazik
Є ще "maven-jar-plugin" він дозволяє додати classpath в маніфест джарки а не писати його кожного разу )))
Для прикладу, депендеси можна брати прямо з мавен репозиторію:

КОД
           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>main.class.full.Name</mainClass>
                            <classpathMavenRepositoryLayout>true</classpathMavenRepositoryLayout>
                            <classpathPrefix>/home/user/.m2/repository</classpathPrefix>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
TIGER
Класно, тепер буду знати. Тільки прохання, на наступний раз куски коду та конфігурації обгортати у відповідні теги для кращого сприймання smile.gif
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Форум IP.Board © 2001-2010 IPS, Inc.