2013-03-09 16 views
24

Maven jest świetny. Przeważnie uniemożliwia mi to wyjście z piekła zależnego od słoja, określając wersje zależnych pakietów w konfiguracji pom i stosuje je automatycznie. Ma również świetną integrację z Eclipse poprzez m2e, dzięki czemu wszystko działa bezproblemowo w środowisku IDE.Maven i Eclipse: niezawodny sposób dodania do projektu non-Maven lub zewnętrznych słoików?

To wszystko jest dobre dla zależności znanych na całym świecie z Maven. Czasami jednak istnieją biblioteki, które należy uwzględnić w projekcie, który nie jest dostępny w repozytoriach Maven. W takim przypadku zazwyczaj dodajemy je do katalogu lib/ w moim projekcie. Dopóki znajdują się w ścieżce klas, kompilują się.

Problem polega jednak na tym, że należy je włączyć automatycznie podczas importowania projektu. Zwalczałem ten problem z na wpół wypalonymi poprawkami i hackami przez zbyt długi czas. Za każdym razem, gdy ktoś instaluje ten projekt, muszę powiedzieć, aby ręcznie dodać słoiki w lib/ do swojej ścieżki budowania Eclipse, aby wszystkie błędy zniknęły. Coś jak następuje:

enter image description here

Szukam sposobu, aby zautomatyzować ten proces w sposób, który działa zarówno z programem wiersza poleceń mvn i Eclipse: więcej nacisk na Eclipse, bo to miło mieć projekty, które kompilują się po ich imporcie.

Nie chcę skonfigurować serwera repo do tego, ani nie mam żadnych własnych zastrzeżonych składników, które uzasadniałyby ustawienie czegoś lokalnie. Mam tylko pliki jar, w których programiści nie używają Mavena; i chcę się z nimi skompilować ... powinienem po prostu włączyć je do dystrybucji mojego oprogramowania, prawda?

Naprawdę szukam rozsądnego sposobu na wdrożenie tego, który będzie działał również w Eclipse bez problemów. This is one solution Znalazłem obiecujące, ale z pewnością nie wydaje się być autorytatywne rozwiązanie tego problemu. Jedyną rzeczą, która się zbliża jest maven-addjars-plugin, który działa dobrze, ale tylko w linii poleceń. Ta wtyczka nie jest złe, i ma dość rozsądną konfigurację:

<plugin> 
    <groupId>com.googlecode.addjars-maven-plugin</groupId> 
    <artifactId>addjars-maven-plugin</artifactId> 
    <version>1.0.5</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>add-jars</goal> 
      </goals> 
      <configuration> 
       <resources> 
        <resource> 
         <directory>${project.basedir}/lib/java-aws-mturk</directory> 
        </resource> 
        <resource> 
         <directory>${project.basedir}/lib/not-in-maven</directory> 
        </resource> 
       </resources> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

jednak próbuje go uruchomić w Eclipse obejmuje dodanie następującego bałagan o mapowaniu cyklem do swojej pom.xml, który nigdy nie dostał się do pracy; Nie sądzę, że jest skonfigurowany tak, aby faktycznie dodać coś do ścieżki budowania 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> 
            com.googlecode.addjars-maven-plugin 
           </groupId> 
           <artifactId> 
            addjars-maven-plugin 
           </artifactId> 
           <versionRange> 
            [1.0.5,) 
           </versionRange> 
           <goals> 
            <goal>add-jars</goal> 
           </goals> 
          </pluginExecutionFilter> 
          <action> 
           <execute /> 
          </action> 
         </pluginExecution> 
        </pluginExecutions> 
       </lifecycleMappingMetadata> 
      </configuration> 
     </plugin> 
    </plugins> 
</pluginManagement> 
+1

Wolałbym polegać na lokalnej instalacji nexusa. –

+1

Chcę móc przekazać to oprogramowanie innym użytkownikom, więc wydaje się to nieuzasadnione. To tylko kilka słoików, którymi chcę się podzielić, więc nie powinno to być aż tak skomplikowane. –

+0

Nexus (lub jakakolwiek inna implementacja repo) pomogłaby w procesie budowania, więc nie byłaby potrzebna dla użytkowników; natomiast jeśli jesteś FOSS, wykorzystywanie bibliotek innych osób i wysyłanie łatek w górę strumienia przyczyniłoby się do rozwoju społeczności. W każdym razie, twój wybór. –

Odpowiedz

45

1) można wykorzystać zależność zakresu systemu

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

2) można skopiować x.jar do lokalnego repozytorium maven jako

repozytorium/test/x/1,0/x- 1.0.jar

i dodać zależność jako

<dependency> 
     <groupId>test</groupId> 
     <artifactId>x</artifactId> 
     <version>1.0</version> 
    </dependency> 
+1

To jest dokładnie to, czego potrzebowałem. Udostępnia także słoiki dla projektów zależnych od tego. Integruje się doskonale z Eclipse i unika wszystkich tych zarządzających repo i XML, które sugerują wszyscy inni. Nie wymaga też kopiowania bzdur do repozytoriów Mavena. +100 przegranych, gdybym mógł. –

+1

@Andrew Mao Dobrze, jeśli to rozwiązanie działa dla Ciebie. Uważaj na to, że [zależności w zakresie systemu są podobne do zależności "dostarczonych"] (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope). Dlatego oczekuje się, że będą istnieć na platformie docelowej i nie będą uwzględnione w opakowanym artefakcie (np. Pliku wojennym). – FrVaBe

+2

Znalazłem zakres systemu, aby wpłynąć na obsługę przejściowych zależności dalej w dół i nie mogliśmy z niego korzystać. Uważam, że właściwą metodą jest zainstalowanie (ręcznie lub skryptowo) artefaktów, których potrzebujesz w lokalnym repozytorium. –

0

Wydaje mi się, że można to zrobić za pomocą Maven Resources Plugin. Wystarczy powiązać kopiowanie zasobów z odpowiednią fazą cyklu życia (faza przed kompilacją). Najprawdopodobniej będziesz musiał zmodyfikować wtyczkę maven-compiler tak, aby te biblioteki były w ścieżce klas podczas kompilacji iw czasie działania.

5

Możesz użyć programu maven do instalowania plików z folderu project \ lib do lokalnego repo z wtyczką maven-install, jak pokazano poniżej. Robiłem to wcześniej ze sterownikami JDBC. Być może będziesz musiał utworzyć oddzielną pom dla niego i wykonać go za pomocą mvn -f installdeps.pom lub coś w tym stylu.

Jeśli możesz sprawić, by gra była przyjemna i wiązała się z cyklem życia podobnym do sprawdzania poprawności lub czymś podobnym, możesz użyć wtyczki m2e z Eclipse i może po prostu odegrać ładnie i odczytać zależności bezpośrednio z pliku pom.xml i zainstalować słoiki w razie potrzeby do lokalnego repozytorium.

<plugin> 
     <!-- We dont want children attempting to install these jars to the repo. --> 
     <inherited>false</inherited> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-install-plugin</artifactId> 
     <executions> 
      <execution> 
       <id>Microsoft JDBC Driver File 1</id> 
       <phase>install</phase> 
       <goals> 
        <goal>install-file</goal> 
       </goals> 
       <configuration> 
        <file>lib/sqljdbc4.jar</file> 
        <groupId>com.microsoft</groupId> 
        <artifactId>microsoft-jdbc-driver</artifactId> 
        <version>4.0</version> 
        <packaging>jar</packaging> 
       </configuration> 
      </execution> 
      <execution> 
       <id>ojdbc5</id> 
       <phase>install</phase> 
       <goals> 
        <goal>install-file</goal> 
       </goals> 
       <configuration> 
        <file>lib/ojdbc5.jar</file> 
        <groupId>com.oracle</groupId> 
        <artifactId>ojdbc5</artifactId> 
        <version>11.1.2</version> 
        <packaging>jar</packaging> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
Powiązane problemy