Включая зависимости в банке с Maven

Есть ли способ заставить maven (2.0.9) включить все зависимости в один файл jar?

У меня есть проект, который строит в один файл jar. Я хочу, чтобы classы из зависимостей были скопированы в банку.

Обновление: я знаю, что я не могу включить файл jar в файл jar. Я ищу способ распаковать банки, которые указаны как зависимости, и упаковать файлы classов в мою банку.

    Вы можете сделать это, используя плагин maven-assembly с дескриптором «jar-with-dependencies». Вот соответствующий fragment из одного из наших pom.xml, который делает это:

        maven-assembly-plugin   package  single      jar-with-dependencies      

    С Maven 2 правильный способ сделать это – использовать Maven2 Assembly Plugin, который имеет предварительно определенный файл дескриптора для этой цели и который вы можете просто использовать в командной строке:

     mvn assembly:assembly -DdescriptorId=jar-with-dependencies 

    Если вы хотите сделать этот jar исполняемым, просто добавьте основной class для запуска в конфигурацию плагина:

      org.apache.maven.plugins maven-assembly-plugin    my.package.to.my.MainClass     

    Если вы хотите создать эту сборку как часть обычного процесса сборки, вы должны привязать одиночную или одиночную цель (цель assembly должна ТОЛЬКО запускаться из командной строки) на фазу жизненного цикла ( package имеет смысл), что-то вроде это:

      org.apache.maven.plugins maven-assembly-plugin   create-my-bundle package  single    jar-with-dependencies  ...     

    Адаптируйте элемент configuration в соответствии с вашими потребностями (например, с помощью манифеста, как сказано).

    Если вы хотите сделать исполняемый файл jar, им также необходимо установить основной class. Таким образом, полная конфигурация должна быть.

        maven-assembly-plugin   package  single        fully.qualified.MainClass    jar-with-dependencies     

    Там плагин тени maven . Его можно использовать для упаковки и переименования зависимостей (для исключения проблем зависимостей в пути к classам).

    Если вы (как и я) не особенно похожи на описанный выше подход jar-with-dependencies , решение maven, которое я предпочитаю, – это просто построить WAR-проект, даже если это только автономное Java-приложение, которое вы создаете:

    1. Создайте нормальный jar-проект maven, который будет строить ваш jar-файл (без зависимостей).

    2. Кроме того, настройте военный проект maven (только с пустым файлом src / main / webapp / WEB-INF / web.xml , который позволит избежать предупреждения / ошибки в maven-build), который имеет только ваш jar-проект как зависимость и сделать ваш jar-проект под вашим военным проектом. (Этот военный проект – всего лишь простой способ обернуть все ваши зависимости jar-файла в zip-файл.)

    3. Постройте военный проект для создания военного файла.

    4. На шаге развертывания просто переименуйте свой .war-файл в * .zip и разархивируйте его.

    Теперь у вас должен быть каталог lib (который вы можете перемещать туда, где вы хотите) с вашей банкой и всеми зависимостями, необходимыми для запуска вашего приложения:

     java -cp 'path/lib/*' MainClass 

    (Подстановочный шаблон в classpath работает на Java-6 или выше)

    Я думаю, что это проще настроить в maven (нет необходимости возиться с плагином сборки), а также дает более четкое представление о структуре приложения (вы увидите номера версий всех зависимых банок в простом виде и не засоряйте все в один файл jar).

    Вы можете использовать только что созданную банку с помощью .

       your.group.id your.artifact.id 1.0 jar jar-with-dependencies   

    http://fiji.sc/Uber-JAR обеспечивает отличное объяснение альтернатив:

    Существует три распространенных метода построения uber-JAR:

    1. Незатушеванная. Распакуйте все файлы JAR, а затем переупакуйте их в один JAR.
      • Pro: Работает с загрузчиком classов по умолчанию Java.
      • Con: Файлы, присутствующие в нескольких файлах JAR с одним и тем же путем (например, META-INF / services / javax.script.ScriptEngineFactory), перезаписывают друг друга, что приводит к ошибочному поведению.
      • Инструменты: Maven Assembly Plugin, Classworlds Uberjar
    2. Затенение. То же, что и unshaded, но переименуйте (т. Е. «Shade») все пакеты всех зависимостей.
      • Pro: Работает с загрузчиком classов по умолчанию Java. Избегает некоторых (не всех) конфликтов версий зависимостей.
      • Con: Файлы, присутствующие в нескольких файлах JAR с одним и тем же путем (например, META-INF / services / javax.script.ScriptEngineFactory), перезаписывают друг друга, что приводит к ошибочному поведению.
      • Инструменты: плагин Maven Shade
    3. JAR JARs. Последний файл JAR содержит другие JAR-файлы, встроенные внутри.
      • Pro: предотвращает конфликты версий зависимостей. Все файлы ресурсов сохранены.
      • Con: Нужно связать специальный загрузчик classов «bootstrap», чтобы Java мог загружать classы из обернутых файлов JAR. Проблемы с загрузкой classа Debugging становятся более сложными.
      • Инструменты: Eclipse JAR File Exporter, One-JAR.

    Мое окончательное решение на Eclipse Luna и m2eclipse: Custom Classloader (загрузите и добавьте в свой проект только 5 classов): http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org. eclipse.jdt.ui / jar% 20in% 20jar% 20loader / org / eclipse / jdt / internal / jarinjarloader / ; этот загрузчик classов является самым лучшим из однозарядных загрузчиков classов и очень быстрым;

    org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader my.Class

    Изменить в JIJConstants «Rsrc-Class-Path» на «Class-Path»
    mvn clean dependency: пакет копий-зависимостей
    создается банка с зависимостями в папке lib с тонким загрузчиком classов

        src/main/java  **/*.java **/*.properties    src/main/resources true  **/*  META-INF/   ${project.build.directory}/dependency/  *.jar  lib/      org.apache.maven.plugins maven-jar-plugin    true ${project.mainClass} lib/   ${project.realMainClass}  ./      org.apache.maven.plugins maven-dependency-plugin   copy-dependencies package  copy-dependencies        в    src/main/java  **/*.java **/*.properties    src/main/resources true  **/*  META-INF/   ${project.build.directory}/dependency/  *.jar  lib/      org.apache.maven.plugins maven-jar-plugin    true ${project.mainClass} lib/   ${project.realMainClass}  ./      org.apache.maven.plugins maven-dependency-plugin   copy-dependencies package  copy-dependencies        в    src/main/java  **/*.java **/*.properties    src/main/resources true  **/*  META-INF/   ${project.build.directory}/dependency/  *.jar  lib/      org.apache.maven.plugins maven-jar-plugin    true ${project.mainClass} lib/   ${project.realMainClass}  ./      org.apache.maven.plugins maven-dependency-plugin   copy-dependencies package  copy-dependencies        в    src/main/java  **/*.java **/*.properties    src/main/resources true  **/*  META-INF/   ${project.build.directory}/dependency/  *.jar  lib/      org.apache.maven.plugins maven-jar-plugin    true ${project.mainClass} lib/   ${project.realMainClass}  ./      org.apache.maven.plugins maven-dependency-plugin   copy-dependencies package  copy-dependencies        
         org.apache.maven.plugins maven-dependency-plugin  ${project.build.directory}/lib false false    copy-dependencies package  copy-dependencies       org.apache.maven.plugins maven-jar-plugin 2.4    true lib/        maven-assembly-plugin   package  single      jar-with-dependencies    

    Отложив Maven в сторону, вы можете поместить JAR-библиотеки внутри Main Jar, но вам нужно будет использовать свой собственный загрузчик classов.

    Проверьте этот проект: Текст ссылки One-JAR

    Это сообщение может быть немного старым, но у меня также была такая же проблема в последнее время. Первое решение, предложенное Джоном Стауффером, является хорошим, но у меня были некоторые проблемы, поскольку я работаю этой весной. Я использую баны зависимости, которые я использую, имеют некоторые файлы свойств и объявление xml-schemas, которые имеют одинаковые пути и имена. Хотя эти баночки берутся из одних и тех же версий, maven-goal jar-with-dependencies переписывал файл theses с последним найденным файлом.

    В конце концов, приложение не смогло начать, поскольку весенние банки не смогли найти правильные файлы свойств. В этом случае решение, предлагаемое Rop, решило мою проблему.

    Также с тех пор проект весенней загрузки теперь существует. У этого есть очень classный способ управлять этой проблемой, предоставляя цель maven, которая перегружает цель пакета и предоставляет свой собственный загрузчик classов. См. Справочник по пружинным ботинкам

    Посмотрите на этот ответ:

    Я создаю установщик, который работает как файл JAR Java, и ему необходимо распаковать WAR и JAR-файлы в соответствующие места в каталоге установки. Плагин зависимостей можно использовать в фазе пакета с целью копирования, и он загрузит любые файлы в репозитории Maven (включая файлы WAR) и напишет их там, где они вам понадобятся. Я сменил выходной каталог на $ {project.build.directory} / classes, а затем конечным результатом является то, что обычная задача JAR включает мои файлы в порядке. Затем я смогу извлечь их и записать их в каталог установки.

      org.apache.maven.plugins maven-dependency-plugin   getWar package  copy     the.group.I.use MyServerServer ${env.JAVA_SERVER_REL_VER} war myWar.war   ${project.build.directory}/classes    

    Спасибо, я добавил ниже fragmentа в файле POM.xml и проблемы с Mp, и создаю файл жира, содержащий все зависимые баночки.

      maven-assembly-plugin   package  single      dependencies     
    Interesting Posts

    Как добавить строки в кадр данных R

    Установите точность std :: to_string при преобразовании значений с плавающей запятой

    Библиотека загрузки DLL – код ошибки 126

    Разбить рабочий лист Excel на несколько рабочих листов на основе столбца с VBA

    Как сохранить DataFrame непосредственно в Hive?

    Как получить FacesContext в фильтре

    Связь с компилятором и controllerом

    Как заставить все ссылки открываться в браузере рабочего стола?

    Проблема с ggplot2, geom_bar и position = “dodge”: уложенная имеет правильные значения y, уклонение не

    Предотвращение всплывающего подтверждения при обновлении полей в Word

    Как получить разрешение reiser4 на ядрах> 2.6.38? Есть ли альтернативные FS, такие как reiser4?

    mpi: блокировка против неблокирующего

    Как перенести музыку с моего iPhone на компьютер?

    Блокирование доступа только к сайту Facebook, а не к другим и / или кнопкам на других страницах

    Как заставить applescript работать с Preview в Snow Leopard?

    Давайте будем гением компьютера.