@aresouji

Как указать Class-Path в MANIFEST.MF maven?

Всем привет, в общем пытаюсь собрать spring приложение с помощью maven в jar. Локальный репозиторий находится в ~/.m2/repository.
MANIFEST.MF:
Manifest-Version: 1.0.0
Created-By: Saveli Tomak
Main-Class: App
Class-Path: /home/saveli/.m2/repository


pow.xml:
...
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
    </dependencies>
...
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>

                <configuration>
                    <archive>
                        <manifestFile>${dir.resources}/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>
            </plugin>
...


Собираю командой mvn package, jar'ник полученный на выходе Spring классы не включает, после запуска получаю
java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext


В Java я нью лвл и не знаю, что с этим поделать, в примерах MANIFEST.MF которые нашел на просторах интернета в Class-Path были указаны пути до самих jar'ников Spring, но я думаю, что это решение не слишком универсальное.

Заранее всем спасибо.
  • Вопрос задан
  • 6326 просмотров
Решения вопроса 1
@zelan
Кратко обо мне не получится.
<plugins>

        <!--Настройка компиляции проекта-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>

                <configuration>

                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>


            <!--Копирование зависимотей в папку lib/-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <configuration>

                    <!--Все зависимости которые нужны для работы твоего приложения будут лежать здесь-->
                    <outputDirectory>${project.build.directory}/lib/</outputDirectory>
                    <overWriteReleases>true</overWriteReleases>
                    <overWriteSnapshots>true</overWriteSnapshots>
                    <overWriteIfNewer>true</overWriteIfNewer>

                </configuration>
                <executions>
                    <execution>

                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>

                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>

                <configuration>
                    <archive>

                        <!--Если надо конфигурировать манифест, то здесь-->
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <!--путь к зависимостям относительно запускаемого jar файла-->
                            <!--ВСЕ ЗАВИСИМОСТИ ДОЛЖНЫ БУДУТ ПОСТАВЛЯТЬСЯ С ТВОИМ jar приложением. -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <classpathLayoutType>simple</classpathLayoutType>

                            <mainClass>main.Main</mainClass>
                        </manifest>
                        <!--<manifestEntries>-->
                        <!--<Rsrc-Class-Path>${}</Rsrc-Class-Path>-->
                        <!--</manifestEntries>-->

                    </archive>
                </configuration>
            </plugin>

        </plugins>


Мавен соберет jar файл, отредактирует манифест. Результатирующий jar будет лежать в папке target - надеюсь знаешь что это. Тамже будет лежать папка lib/ со всеми завимостями (другими jar файлами). Если взять результирующий jar и эту папку, и положить вместе в другую папку - то получится полноценный дистрибутив. Но это уже другой плагин. Со временем разберешься.

В твоем варианте вообще все изначально не верно. В манифесте должны быть прописаны все используемые jar файлы. Старайся не лезть в манифейст вообще. А у тебя указан только /home/saveli/.m2/repository - там куча папок,с кучей версий jar, поэтому ничего и не находит.

Третий плагин можно вообще убрать, но тогда все jаr файлы из папки target/lib/ должны лежать рядом с результирующим jar.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽