2010-02-09 15 views
186

Mam zastrzeżony słoik, który chcę dodać do mojego pom jako zależności.Maven: dodaj zależność do słoju według względnej ścieżki

Ale nie chcę dodawać go do repozytorium. Powodem jest to, że chcę, aby moje standardowe polecenia, takie jak mvn compile itp., Działały po wyjęciu z pudełka. (Nie wymagając od programistów, aby dodali je do jakiegoś repozytorium samodzielnie).

Chcę, aby słoik znajdował się w bibliotece 3rdparty w kontrolce źródła i łączył go ze ścieżką względną z pliku pom.xml.

Czy to można zrobić? W jaki sposób?

+3

tak i zapłacić za uzyskanie straszny dsl, faza modelu nikt faktycznie można opisać i rozdzielczości zależność brzydko bluszcz ... sparowany z dobrym starym mrówek piekła. prawidłowy sposób gry jest opisany poniżej. EDYCJA: aby być bardziej grzecznym ... TO zapytał, jak rozwiązać problem z mavenem, a nie jak to zrobić w gradle. – gorefest

+0

tak, może dodatek do instalacji maven nie powinien ignorować zależności systemu lub mieć dla niego przełącznik – Enerccio

Odpowiedz

288

Chcę, aby słoik znajdował się w bibliotece 3rdparty w kontrolce źródła i łączył go ze ścieżką względną z pliku pom.xml.

Jeśli naprawdę chcesz to (zrozumieć, jeśli nie można korzystać z repozytorium korporacyjnego), to moja rada byłoby użyć „repozytorium plików” lokalnej do projektu i do nie używaćsystem scoped zależność. Należy unikać zakresu system, takie zależności nie działają dobrze w wielu sytuacjach (na przykład podczas montażu), powodują więcej problemów niż korzyści.

Tak więc, zamiast oświadczyć repozytorium lokalnego do projektu:

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

zainstalować trzeci lib partii tam używając install:install-file z parametrem localRepositoryPath:

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
         -DartifactId=<myArtifactId> -Dversion=<myVersion> \ 
         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path> 

Aktualizacja: Wygląda na to, że install:install-file ignoruje localRepositoryPath podczas korzystania z wersji 2.2 wtyczki. Działa jednak z wersją 2.3 i późniejszą wtyczki. Więc używać pełnej nazwy wtyczki, aby określić wersję:

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \ 
         -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
         -DartifactId=<myArtifactId> -Dversion=<myVersion> \ 
         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path> 

maven-install-plugin documentation

Wreszcie zadeklarować go jak każdego innego uzależnienia (ale bez zakres system):

<dependency> 
    <groupId>your.group.id</groupId> 
    <artifactId>3rdparty</artifactId> 
    <version>X.Y.Z</version> 
</dependency> 

ten to IMHO jest lepszym rozwiązaniem niż użycie zakresu system, ponieważ twoja zależność będzie traktowana jak dobry obywatel (np. zostanie on włączony do zespołu i tak dalej).

Teraz muszę nadmienić, że "właściwą drogą" do radzenia sobie z tą sytuacją w środowisku korporacyjnym (może nie w tym przypadku) byłoby skorzystanie z korporacyjnego repozytorium.

+5

"Naprawdę, jest to lepsze rozwiązanie niż użycie zakresu systemowego" - rzeczywiście (+1) – Bozho

+2

To świetny pomysł, ale na Maven 2.2.1 wydaje się, że wtyczka instalacyjna ignoruj ​​'l ocalRepositoryPath' ... – Jake

+0

@Jake Rzeczywiście, wygląda jak błąd w wersji 2.2 wtyczki. Zaktualizowałem swoją odpowiedź wersją, która działa. –

95

Korzystanie z zakresu system. ${basedir} to katalog twojego pom.

<dependency> 
    <artifactId>..</artifactId> 
    <groupId>..</groupId> 
    <scope>system</scope> 
    <systemPath>${basedir}/lib/dependency.jar</systemPath> 
</dependency> 

Jednak jest to wskazane, aby zainstalować słoik w repozytorium, a nie zobowiązują go do SCM - przecież to właśnie Maven próbuje wyeliminować.

+11

Systemu zasięgu należy unikać wszędzie, gdzie jest to możliwe. Zainstaluj JAR w repozytorium jest lepszym rozwiązaniem ... –

+8

tak, jeśli to możliwe. powiedział wprost, że nie chce umieścić go w repozytorium. Dodałem komentarz, aby zaznaczyć, że nie jest to dobra praktyka. Ale to działa. – Bozho

+0

Groovy, twoje rozwiązanie jest jak najbardziej do zaakceptowania, jak dotąd. Całkowicie błędnie przeczytałem pytanie. – ant

9

mam poprzednio written about a pattern jak to zrobić.

Jest bardzo podobny do rozwiązania zaproponowanego przez Pascala, mimo że przenosi wszystkie takie zależności do dedykowanego modułu repozytorium, dzięki czemu nie trzeba go powtarzać wszędzie tam, gdzie używana jest zależność, jeśli jest to wielomodułowa kompilacja.

24

Jest to kolejna metoda oprócz mojej poprzedniej odpowiedzi na Can I add jars to maven 2 build classpath without installing them?

Będzie to obejść limit przy użyciu wielomodułowego buduje zwłaszcza jeśli ściągnięty JAR jest wymieniony w projektach potomnych poza rodzica. Zmniejsza to również prace instalacyjne, tworząc pliki POM i SHA1 w ramach kompilacji. Pozwala również na przechowywanie pliku w dowolnym miejscu w projekcie bez ustalania nazw lub podążania za strukturą repozytorium.

Korzysta z wtyczki maven-install-plugin. Aby to działało, musisz skonfigurować projekt wielomodułowy i mieć nowy projekt reprezentujący kompilację, aby zainstalować pliki w lokalnym repozytorium i upewnić się, że jest on pierwszy.

możliwość multi-module projektu pom.xml będzie wyglądać następująco:

<packaging>pom</packaging> 
<modules> 
<!-- The repository module must be first in order to ensure 
    that the local repository is populated --> 
    <module>repository</module> 
    <module>... other modules ...</module> 
</modules> 

Plik repozytorium/pom.xml wtedy zawierać definicje załadować słoikach, które są częścią projektu. Poniżej znajdują się niektóre fragmenty pliku pom.xml.

<artifactId>repository</artifactId> 
<packaging>pom</packaging> 

pakowanie POM uniemożliwia wykorzystanie tego robić żadnych testów lub skompilować lub generowania dowolny plik jar. Mięso z pom.xml znajduje się w sekcji build, gdzie używana jest wtyczka maven-install.

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-install-plugin</artifactId> 
      <executions> 
       <execution> 
         <id>com.ibm.db2:db2jcc</id> 
         <phase>verify</phase> 
         <goals> 
          <goal>install-file</goal> 
         </goals> 
         <configuration> 
          <groupId>com.ibm.db2</groupId> 
          <artifactId>db2jcc</artifactId> 
          <version>9.0.0</version> 
          <packaging>jar</packaging> 
          <file>${basedir}/src/jars/db2jcc.jar</file> 
          <createChecksum>true</createChecksum> 
          <generatePom>true</generatePom> 
         </configuration> 
       </execution> 
       <execution>...</execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Aby zainstalować więcej niż jeden plik, wystarczy dodać kolejne egzekucje.

+0

Bardzo interesujące, dziękuję za to! –

+0

To jest jedyna rzecz, która zadziałała dla mojego projektu wielomodułowego. Lokalne podejście z nieznanego powodu nie zadziałało. Więc dziękuję! – Lonzak

3

zmieniliśmy na gradle i działa to znacznie lepiej w gradle;). właśnie określamy folder, w którym możemy upuścić słoiki na takie tymczasowe sytuacje. Nadal mamy większość naszych słoików zdefiniowanych w typowej sekcji zarządzania zależnościami (tj. Tak samo jak w przypadku maven). Jest to tylko jedna zależność, którą definiujemy.

więc teraz możemy po prostu zostawić dowolny słoik, który chcemy, w naszym katalogu dla tymczasowego testowania, jeśli nie jest on gdzieś w repozytorium mavenów.

+0

Możesz podać przykład, jak to zrobiłeś? – Thomas

1

Jeden mały dodatek do roztworu pisał Pascal

Kiedy po tej trasie, mam błąd w Maven podczas instalacji ojdbc jar.

[INFO] --- maven-install-plugin:2.5.1:install-file (default-cli) @ validator --- 
[INFO] pom.xml not found in ojdbc14.jar 

Po dodaniu -DpomFile, problem został rozwiązany.

$ mvn install:install-file -Dfile=./lib/ojdbc14.jar -DgroupId=ojdbc \ 
    -DartifactId=ojdbc -Dversion=14 -Dpackaging=jar -DlocalRepositoryPath=./repo \ 
    -DpomFile=~/.m2/repository/ojdbc/ojdbc/14/ojdbc-14.pom 
4

Zasadniczo dodaj to do pom.xml:

... 

<repositories> 
    <repository> 
     <id>lib_id</id> 
     <url>file://${project.basedir}/lib</url> 
    </repository> 
</repositories> 

... 

<dependencies> 
    ... 
    <dependency> 
     <groupId>com.mylibrary</groupId> 
     <artifactId>mylibraryname</artifactId> 
     <version>1.0.0</version> 
    </dependency> 
    ... 
</dependencies> 
0

można wykorzystywać zaćmienie wygenerować runnable słoika: Eksportuj plik/Runable Jar

+0

Nie jestem pewien, czy odpowiada na pytanie. Ma już plik jako słoik. –

+0

Eclipse obsługuje uberjar lub zacieniony słoik, więc jest to rozwiązanie, ale nie dla mavenów –

3

To działa dla mnie: Załóżmy, że mam tę zależność

<dependency> 
    <groupId>com.company.app</groupId> 
    <artifactId>my-library</artifactId> 
    <version>1.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/my-library.jar</systemPath> 
</dependency> 

Następnie , dodaj ścieżkę klasy dla zależności systemowej ręcznie, tak jak ta, tak jak ta

Pełna config:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <archive> 
      <manifestEntries> 
       <Build-Jdk>${jdk.version}</Build-Jdk> 
       <Implementation-Title>${project.name}</Implementation-Title> 
       <Implementation-Version>${project.version}</Implementation-Version> 
       <Specification-Title>${project.name} Library</Specification-Title> 
       <Specification-Version>${project.version}</Specification-Version> 
       <Class-Path>libs/my-library-1.0.jar</Class-Path> 
      </manifestEntries> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <mainClass>com.company.app.MainClass</mainClass> 
       <classpathPrefix>libs/</classpathPrefix> 
      </manifest> 
     </archive> 
    </configuration> 
</plugin> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.5.1</version> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/libs/</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin>