Maven добавляет банки через systemPath / system, но не добавляется ни в войну, ни где-либо еще - PullRequest
18 голосов
/ 08 апреля 2011

Я хочу добавить файл jar через systemPath из локальной файловой системы относительно структуры каталогов моего проекта, а не в удаленном хранилище. Я добавил объявление зависимости, но Maven больше ничего с ним не делает.

В приведенном ниже объявлении я хочу, чтобы файл jar был скопирован в мой целевой каталог web-inf / lib, а также jarred как часть файла war. В настоящее время этого не происходит. Как мне скопировать jar-файл в мой war-файл?

Это вывод из режима отладки maven:

DEBUG] cglib:cglib-nodep:jar:2.2:test (setting scope to: compile)^M
DEBUG] Retrieving parent-POM: org.objenesis:objenesis-parent:pom:1.2 for project: null:objenesis:ja
DEBUG]   org.objenesis:objenesis:jar:1.2:test (selected for test)^M
DEBUG]   org.javap.web:testRunWrapper:jar:1.0.0:system (selected for system)^M
DEBUG] Plugin dependencies for:
...


<dependency>
    <groupId>org.javap.web</groupId>
    <artifactId>testRunWrapper</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/testRunWrapper.jar</systemPath>
</dependency>
<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>                 
        <webResources>
            <resource>
                <directory>WebContent</directory>
            </resource>
        </webResources>
    </configuration>
</plugin>

Ответы [ 7 ]

24 голосов
/ 08 апреля 2011

ОК, я сделал это: обратите внимание на структуру каталогов внизу. При использовании подхода, приведенного ниже, файл jar из относительного пути проекта рассматривается как гражданин первого класса, как и другие jar. Список ниже исправляет мою первоначальную проблему. С приведенным ниже списком pom.xml файл jar копируется в мой целевой каталог.

<repositories>
    <repository>
        <id>JBoss</id>
        <name>JBoss Repository</name>
        <layout>default</layout>
        <url>http://repository.jboss.org/maven2</url>
    </repository>

    <repository>
       <id>my-local-repo</id>
       <url>file://${basedir}/lib/repo</url>
    </repository>
</repositories>

<dependency>
    <groupId>testRunWrapper</groupId>
    <artifactId>testRunWrapper</artifactId>
    <version>1.0.0</version>            
</dependency>

$ find repo
repo
repo/testRunWrapper
repo/testRunWrapper/testRunWrapper
repo/testRunWrapper/testRunWrapper/1.0.0
repo/testRunWrapper/testRunWrapper/1.0.0/testRunWrapper-1.0.0.jar
18 голосов
/ 26 июня 2014

Использование плагина зависимостей maven делает работу:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.8</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>
                        <includeScope>system</includeScope>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
5 голосов
/ 08 апреля 2011

Не используйте систему.Чтобы сделать то, что вы хотите, просто объявите как обычную (компилируемую) зависимость и используйте mvn install: install-file в ваш локальный репозиторий.Все остальное будет работать так, как вы хотите (lib будет скопирована и т. Д.). Это будет означать, что сборка будет работать только на вашем компьютере.

Чтобы исправить это для вашей (внутренней) команды, вам нужнохотите создать хранилище (например, Artifactory, Nexus или Archiva).Это почти необходимо для командного использования Maven.

Если это для публичного использования (например, с открытым исходным кодом), вы можете либо имитировать хранилище через http-сервер, либо создать реальное хранилище.

2 голосов
/ 06 июня 2011

попробуйте что-то вроде этого (используя плагин Ant, чтобы вручную поместить jar в выходной каталог):

<plugin>
       <artifactId>maven-antrun-plugin</artifactId>
       <executions>
         <execution>
           <phase>test</phase>
           <goals>
             <goal>run</goal>
           </goals>
           <configuration>
             <tasks>
               <copy file="${project.basedir}/pathToJAR.jar"
                     todir="${project.build.directory}/outputFileName/WEB-INF/lib"/>
             </tasks>
           </configuration>
         </execution>
       </executions>
     </plugin>
1 голос
/ 08 апреля 2011

AFAIK, зависимости области видимости системы отчасти похожи на те, которые имеют заданную область видимости и, следовательно, не включены в целевой артефакт.Почему бы вам не установить зависимость в свой локальный репозиторий?

Из документа:

system Эта область похожа на предоставленную, за исключением того, что вы должны предоставить JAR, который содержит ее явно.Артефакт всегда доступен и не просматривается в хранилище.

0 голосов
/ 24 августа 2017

В случае, если этот ответ не сработал для вас, как для меня, а вы знаете, что system - это плохая область, вы можете попробовать это решение там, где вы Установкаjar с помощью install-plugin (прокрутите немного вниз), который устанавливает JAR в ваш реальный локальный Maven-репозиторий.По сути, вам нужно всего лишь добавить этот плагин в pom.xml:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <version>2.4</version>
  <executions>
    <execution>
      <phase>initialize</phase>
      <goals>
        <goal>install-file</goal>
      </goals>
      <configuration>
        <groupId>myGroupId</groupId>
        <artifactId>myArtifactId</artifactId>
        <version>myVersion</version>
        <packaging>jar</packaging>
        <file>${basedir}/lib/xxx.jar</file>
      </configuration>
    </execution>
  </executions>
</plugin>

. Заполните соответствующие значения для groupId, artifactId и version и поместите исходный файл jar в * 1013.* -каталог и исправление file выше.Вы можете добавить больше execution -секций, но затем не забудьте добавить туда id s, например:

      <execution>
        <id>common-lib</id>

Каждый, кто обновляется в репо-коде, должен один раз вызвать mvn initialize.

И все энтузиасты Eclipse могут добавить это к pom.xml, чтобы избавиться от ошибок в Eclipse:

<pluginManagement>
  <plugins>
    <!-- This plugin's configuration is used to store Eclipse m2e settings 
      only. It has no influence on the Maven build itself. -->
    <plugin>
      <groupId>org.eclipse.m2e</groupId>
      <artifactId>lifecycle-mapping</artifactId>
      <version>1.0.0</version>
      <configuration>
        <lifecycleMappingMetadata>
          <pluginExecutions>
            <pluginExecution>
              <pluginExecutionFilter>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <versionRange>[2.4,)</versionRange>
                <goals>
                  <goal>install-file</goal>
                </goals>
              </pluginExecutionFilter>
              <action>
                <execute></execute>
              </action>
            </pluginExecution>
          </pluginExecutions>
        </lifecycleMappingMetadata>
      </configuration>
    </plugin>
  </plugins>
</pluginManagement>
0 голосов
/ 18 апреля 2013

Проблема с использованием ссылки на файловую систему заключается в том, что зависимые проекты не смогут получить глобальный доступ к этому файлу JAR.то есть $ {basedir} зависимого проекта отличается, и поэтому файл .jar не будет найден.

Глобальные репозитории с другой стороны доступны повсеместно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...