2011-07-13 15 views
22

Chciałbym używać zależności z odległego repozytorium Eclipse p2 w "zwykłej" kompilacji Maven 3 (np. JAR lub WAR) - wszystko to bez konwersji repozytorium p2 na repozytorium Maven (co jest tym, co osgi-to- maven2 i m4e wydają się robić).Czy używasz zależności z repozytorium Eclipse p2 w zwykłej kompilacji Mavena?

Idealnie byłoby użyć tylko http://maven.eclipse.org/nexus/, ale to nie (jeszcze?) Zawiera wiele pakietów.

Korzystanie z systemu Maven System Path nie ma znaczenia!

Odpowiedz

20

Wygląda jakbym odpowiadając kolejny z moich własnych pytań ..

Przede wszystkim, można użyć Tycho dodać zależność od pakietu z repozytorium P2:

  • Configure Build używać tycho-maven-plugin.
  • Służy do określania repozytorium P2.
  • Ustaw opakowanie na "wtyczkę eclipse".
  • Utwórz manifest dla swojej kompilacji i użyj Require-Bundle do określenia zależności (np. Org.eclipse.xsd). Ustaw również wersję pakietu na tę samą wersję, której użyliśmy do naszej kompilacji w pom.xml.

Dajmy że try:

$ mvn dependency:tree 
[INFO] com.example:org.eclipse.xsd:eclipse-plugin:0.0.1 
[INFO] +- p2.eclipse-plugin:org.eclipse.xsd:jar:2.6.0.v20100914-1218:system 
[INFO] ... 
[INFO] \- p2.eclipse-plugin:org.eclipse.core.filesystem:jar:1.3.1.R36x_v20100727-0745:system 

Nasza zależność został pomyślnie rozwiązany z repozytorium P2. Niestety, jeszcze nie skończyliśmy. Zależność została dodana wraz z zasięgiem systemu, co oznacza, że ​​artefakty nie zostaną uwzględnione, jeśli utworzymy aplikację webową, która zależy od naszej kompilacji. Aby to obejść, najpierw rozpakujemy wszystkie klasy zawarte w zależności do jakiegoś katalogu, a następnie ponownie zapakujemy ten katalog jako słoik i użyjemy go jako ostatecznego artefaktu naszej kompilacji.

Dla pierwszej części (rozpakowywanie) dodajemy wtyczkę maven-dependency do naszej kompilacji i konfigurujemy ją tak, aby podczas fazy pakietu uruchamiała się jego funkcja unpack-dependencies. W przypadku drugiej części (przepakowywania) dodajemy do naszej kompilacji wtyczkę maven-assembly i konfigurujemy ją tak, aby uruchamiała swój pojedynczy cel podczas fazy pakietu. Musimy również utworzyć i skonfigurować niestandardowy deskryptor zespołu.

Nasz build składa się obecnie z 3 pliki: plik build w pom.xml:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example</groupId> 
    <artifactId>org.eclipse.xsd</artifactId> 
    <version>0.0.1</version> 
    <packaging>eclipse-plugin</packaging> 
    <repositories> 
     <repository> 
      <id>helios</id> 
      <layout>p2</layout> 
      <url>http://download.eclipse.org/releases/helios</url> 
     </repository> 
    </repositories> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.eclipse.tycho</groupId> 
       <artifactId>tycho-maven-plugin</artifactId> 
       <version>0.12.0</version> 
       <extensions>true</extensions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>unpack-dependencies</id> 
         <phase>package</phase> 
         <goals> 
          <goal>unpack-dependencies</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${project.build.directory}/dependency</outputDirectory> 
          <overWriteReleases>false</overWriteReleases> 
          <overWriteSnapshots>true</overWriteSnapshots> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.2.1</version> 
       <configuration> 
        <descriptors> 
         <descriptor>src/main/assembly/repackaged.xml</descriptor> 
        </descriptors> 
       </configuration> 
       <executions> 
        <execution> 
         <id>make-assembly</id> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Manifest w META-INF/MANIFEST.MF:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: Ignored 
Bundle-SymbolicName: Ignored 
Bundle-Version: 0.0.1 
Require-Bundle: org.eclipse.xsd 
Bundle-Vendor: Ignored 

deskryptor montaż w src /main/assembly/repackaged.xml:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>repackaged</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
     <fileSet> 
     <directory>${project.build.directory}/dependency/</directory> 
     <outputDirectory>/</outputDirectory> 
     <useDefaultExcludes>true</useDefaultExcludes> 
     </fileSet> 
    </fileSets> 
</assembly> 

pakiet teraz mvn utworzy plik jar, który zawiera cały kod od nasza zależność P2, ponownie zapakowana jako właściwy artefakt Maven, gotowa do użycia jako zależność w innym projekcie.

$ jar tf target/org.eclipse.xsd-0.0.1-repackaged.jar 
org/eclipse/xsd/ecore/XSDEcoreBuilder$1.class 
org/eclipse/xsd/ecore/XSDEcoreBuilder$2.class 
org/eclipse/xsd/ecore/XSDEcoreBuilder$Comparator.class 
org/eclipse/xsd/ecore/XSDEcoreBuilder$EffectiveOccurrence.class 
org/eclipse/xsd/ecore/XSDEcoreBuilder.class 
+0

Nie mam pojęcia, o czym grzecznie wspominasz w drugiej połowie twojego komentarza. Ale generalnie, jeśli nie chcesz korzystać z Tycho, idź naprzód i znajdź odpowiedź nie Tycho na to pytanie i opublikuj to tutaj. –

+0

Ma to jedną wadę: jeśli twoje IDE nie rozumie tycho/p2 (np. Netbeans), to nie doda słoika do ścieżki klasy i nie będziesz mieć autouzupełniania/nawigacji, nawet jeśli kompilacja przez Mavena faktycznie działa . –

+0

czy możesz mi pomóc z nieco podobnym problemem? http://stackoverflow.com/questions/38099426/is-it-possible-to-resolve-dependencies-in-maven-plugin-from-p2-repo – Disha

Powiązane problemy