7 Stimmen

Maven include JavaDoc Jar in Assembly

Ich habe ein Projekt mit mehreren Modulen, darunter eines, das für die Erstellung der endgültigen Baugruppe aus den Artefakten der anderen Module verantwortlich ist. Als Teil der Baugruppe möchte ich die JavaDocs für zwei der anderen Module einbinden. Ich habe die pom-Dateien für diese Module aktualisiert, um die JavaDoc-JAR-Dateien zu generieren, und das Assembly-Projekt geändert, um diese JavaDoc-JAR-Dateien als Abhängigkeiten aufzulisten. Wenn ich das Projekt jedoch von der obersten Ebene aus baue, meldet mir das Assembly-Projekt, dass es die JavaDoc-Jar-Dateien nicht finden kann. Wenn ich zuerst alle anderen Module installiere und dann das Assembly-Modul direkt erstelle, wird die Assembly problemlos erstellt.

Wie kann ich erreichen, dass die Baugruppe mit allen angegebenen Abhängigkeiten korrekt erstellt wird, wenn sie von der obersten Projektebene aus ausgeführt wird?

Bearbeitet, um auf Wunsch der Antwortenden weitere Informationen hinzuzufügen:

Hier ist ein vereinfachtes Projekt, das ich zusammengestellt habe, um das Problem zu demonstrieren. Das Verzeichnis ist wie folgt aufgebaut:

sample/
  \\--pom.xml
  \\--module1/
       \\--pom.xml
       \\--src/ 
            \\--{the usual main/java layout with a single java file, with javadocs}
  \\--package/
       \\--pom.xml
       \\--assemblies/
            \\--bin.xml

Die oberste Ebene der pom.xml unter sample sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4\_0\_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>test</groupId>
  <artifactId>project</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <modules>
    <module>module1</module>
    <module>package</module>
  </modules>

  <build>
    <defaultGoal>package</defaultGoal>
  </build>
</project>

Die pom.xml von module1 ist eine einfache Projektdatei mit einem Eintrag für das javadoc-Plugin:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4\_0\_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>test</groupId>
  <artifactId>module1</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.6</version>
        <executions>
          <execution>
            <id>javadoc-jar</id>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Die pom-Datei des Paketmoduls spezifiziert Abhängigkeiten von der Jar-Datei module1 und der JavaDoc-Jar-Datei module1:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4\_0\_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <!-- The Basics -->
  <groupId>test</groupId>
  <artifactId>packaging</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <!-- Shared Dependencies -->
  <dependencies>
    <dependency>
      <groupId>test</groupId>
      <artifactId>module1</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

    <dependency>
      <groupId>test</groupId>
      <artifactId>module1</artifactId>
      <version>1.0-SNAPSHOT</version>
      <classifier>javadoc</classifier>
    </dependency>
  </dependencies>

  <!-- Build Settings -->
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2-beta-4</version>
        <configuration>
          <descriptors>
            <descriptor>assemblies/bin.xml</descriptor>
          </descriptors>
        </configuration>

        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- append to the packaging phase. -->
            <goals>
              <goal>single</goal> <!-- goals == mojos -->
            </goals>
          </execution>
        </executions>

      </plugin>

    </plugins>
  </build>

</project>

Und schließlich enthält die Assembly-Datei die beiden Abhängigkeiten, wobei die JavaDoc jar-Datei entpackt in der assemblierten Datei gespeichert wird. Ich habe jede dependencySet strenge Filterung zu verwenden, um die Unfähigkeit der Assembly-Plugin, die angegebenen Dateien zu finden, zu markieren.

<assembly>
  <id>bin</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>

  <dependencySets>
    <dependencySet>
      <excludes>
        <!-- Exclude the Jars that are included in later sections -->
        <exclude>test:module1:jar:javadoc</exclude>
      </excludes>
      <outputDirectory>lib</outputDirectory>
      <unpack>false</unpack>
      <useTransitiveDependencies>true</useTransitiveDependencies>
      <useTransitiveFiltering>false</useTransitiveFiltering>
      <useProjectArtifact>false</useProjectArtifact>
    </dependencySet>

    <dependencySet>
      <includes>
        <include>test:module1:jar:javadoc</include>
      </includes>
      <outputDirectory>docs</outputDirectory>
      <unpack>true</unpack>
      <useTransitiveDependencies>true</useTransitiveDependencies>
      <useProjectArtifact>false</useProjectArtifact>
      <useStrictFiltering>true</useStrictFiltering>
    </dependencySet>
  </dependencySets>
</assembly>

Wenn Sie dieses Projekt von oben ausführen, erhalten Sie die folgende Ausgabe:

\[INFO\] Scanning for projects...
\[INFO\] Reactor build order: 
\[INFO\]   Unnamed - test:module1:jar:1.0-SNAPSHOT
\[INFO\]   Unnamed - test:packaging:pom:1.0-SNAPSHOT
\[INFO\]   Unnamed - test:project:pom:1.0-SNAPSHOT
\[INFO\] ------------------------------------------------------------------------
\[INFO\] Building Unnamed - test:module1:jar:1.0-SNAPSHOT
\[INFO\]    task-segment: \[clean, package\]
\[INFO\] ------------------------------------------------------------------------
\[INFO\] \[clean:clean\]
\[INFO\] Deleting directory /Users/john/Documents/src/workspace/sample/module1/target
\[INFO\] \[resources:resources\]
\[WARNING\] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
\[INFO\] Copying 0 resource
\[INFO\] \[compiler:compile\]
\[INFO\] Compiling 1 source file to /Users/john/Documents/src/workspace/sample/module1/target/classes
\[INFO\] \[resources:testResources\]
\[WARNING\] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
\[INFO\] skip non existing resourceDirectory /Users/john/Documents/src/workspace/sample/module1/src/test/resources
\[INFO\] \[compiler:testCompile\]
\[INFO\] No sources to compile
\[INFO\] \[surefire:test\]
\[INFO\] No tests to run.
\[INFO\] \[jar:jar\]
\[INFO\] Building jar: /Users/john/Documents/src/workspace/sample/module1/target/module1-1.0-SNAPSHOT.jar
\[INFO\] \[javadoc:jar {execution: javadoc-jar}\]
\[WARNING\] Source files encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
Loading source files for package test...
Constructing Javadoc information...
Standard Doclet version 1.5.0\_20
Building tree for all the packages and classes...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/test//AClass.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/test//package-frame.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/test//package-summary.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/test//package-tree.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/constant-values.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/test/class-use//AClass.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/test//package-use.html...
Building index for all the packages and classes...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/overview-tree.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/index-all.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/deprecated-list.html...
Building index for all classes...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/allclasses-frame.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/allclasses-noframe.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/index.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/help-doc.html...
Generating /Users/john/Documents/src/workspace/sample/module1/target/apidocs/stylesheet.css...
\[INFO\] Building jar: /Users/john/Documents/src/workspace/sample/module1/target/module1-1.0-SNAPSHOT-javadoc.jar
\[INFO\] ------------------------------------------------------------------------
\[INFO\] Building Unnamed - test:packaging:pom:1.0-SNAPSHOT
\[INFO\]    task-segment: \[clean, package\]
\[INFO\] ------------------------------------------------------------------------
\[INFO\] \[clean:clean\]
\[INFO\] Deleting directory /Users/john/Documents/src/workspace/sample/package/target
\[INFO\] \[site:attach-descriptor\]
\[INFO\] \[assembly:single {execution: make-assembly}\]
\[INFO\] Reading assembly descriptor: assemblies/bin.xml
\[WARNING\] The following patterns were never triggered in this artifact exclusion filter:
o  'test:module1:jar:javadoc'

\[WARNING\] The following patterns were never triggered in this artifact inclusion filter:
o  'test:module1:jar:javadoc'

\[INFO\] ------------------------------------------------------------------------
\[ERROR\] BUILD FAILURE
\[INFO\] ------------------------------------------------------------------------
\[INFO\] : org.apache.maven.plugin.assembly.model.Assembly@139c27
Assembly is incorrectly configured: bin

Assembly: bin is not configured correctly: One or more filters had unmatched criteria. Check debug log for more information.
\[INFO\] ------------------------------------------------------------------------
\[INFO\] For more information, run Maven with the -e switch
\[INFO\] ------------------------------------------------------------------------
\[INFO\] Total time: 12 seconds
\[INFO\] Finished at: Wed Oct 07 15:23:26 PDT 2009
\[INFO\] Final Memory: 26M/52M
\[INFO\] ------------------------------------------------------------------------

Ich habe dieses Projekt veröffentlicht für herunterladen .

7voto

John Haager Punkte 2047

Ich habe eine Lösung gefunden, die zu funktionieren scheint (zumindest bei der Beispielanwendung, die ich gepostet habe). Ich habe die Einschluss-/Ausschluss-Einträge in der Assembly-Datei so geändert, dass nur der Typ als Platzhalter verwendet wird, und die Assembly verhält sich jetzt genau wie erwartet. Die JavaDoc-JAR-Datei wird nicht in das lib-Verzeichnis gelegt, und die JavaDocs werden wie vorgesehen entpackt.

Die endgültige Montagedatei sieht wie folgt aus:

<assembly>
  <id>bin</id>
  <formats>
 <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>

  <dependencySets>
    <dependencySet>
      <excludes>
        <!-- Exclude the Jars that are included in later sections -->
        **<exclude>test:module1:\*:javadoc</exclude>**
      </excludes>
      <outputDirectory>lib</outputDirectory>
      <unpack>false</unpack>
      <useTransitiveDependencies>true</useTransitiveDependencies>
      <useTransitiveFiltering>false</useTransitiveFiltering>
      <useProjectArtifact>false</useProjectArtifact>
    </dependencySet>

    <dependencySet>
      <includes>
        **<include>test:module1:\*:javadoc</include>**
      </includes>
      <outputDirectory>docs</outputDirectory>
      <unpack>true</unpack>
      <useTransitiveDependencies>true</useTransitiveDependencies>
      <useProjectArtifact>false</useProjectArtifact>
      <useStrictFiltering>true</useStrictFiltering>
    </dependencySet>
  </dependencySets>
</assembly>

Aktualisierung: Einige schnelle Tests haben ergeben, dass der Typ der JavaDoc Jar-Dateien, zumindest wenn sie von einem vollständigen Build referenziert werden, "javadoc" ist. Wenn das Paketmodul jedoch eigenständig ausgeführt wird, wird dieser Typ nicht erkannt und kann nicht aus dem lokalen Repository abgerufen werden. Es scheint also, dass Sie den Typ der JavaDoc-Jar-Dateien in der Assembly mit einem Platzhalter versehen müssen, um beide Build-Modi zu erhalten (als Teil des Gesamt-Builds und beim eigenständigen Build).

4voto

Pascal Thivent Punkte 548176

Es gibt ein Problem mit dem test:module1:jar:javadoc Identitätsmuster, das für den Ausschluss und die Einbeziehung von Abhängigkeiten in beiden <dependencySet> wie in der Build-Fehlersuche zu sehen ist:

\[WARNING\] The following patterns were never triggered in this artifact exclusion filter:
o  'test:module1:jar:javadoc'

\[WARNING\] The following patterns were never triggered in this artifact inclusion filter:
o  'test:module1:jar:javadoc'

Um ehrlich zu sein, kann ich nicht erkennen, was an dem test:module1:jar:javadoc Muster: Es folgt dem groupId:artifactId:type[:classifier] Format und sieht für mich absolut in Ordnung aus (könnte das ein Fehler sein?). Tatsache ist jedoch, dass es mit keiner Abhängigkeit übereinstimmt, und das verursacht zwei Probleme:

  1. wird das javadoc jar nicht ausgeschlossen und landet in lib neben dem anderen Gefäß,
  2. es wird nichts gefunden, was in docs und dies führt zum Scheitern des Builds.

Die einzige Möglichkeit, die ich gefunden habe, um das Ganze zum Laufen zu bringen, ist die Verwendung eines Musters mit einem Platzhalter (genauer gesagt *:javadoc ). Nachstehend eine aktualisierte Baugruppenbeschreibung:

<assembly>
  <id>bin</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>

  <dependencySets>
    <dependencySet>
      <excludes>
        <!-- Exclude the Jars that are included in later sections -->
        <exclude>*:javadoc</exclude>
      </excludes>
      <outputDirectory>lib</outputDirectory>
      <unpack>false</unpack>
      <useTransitiveDependencies>true</useTransitiveDependencies>
      <useTransitiveFiltering>false</useTransitiveFiltering>
      <useProjectArtifact>false</useProjectArtifact>
    </dependencySet>

    <dependencySet>
      <includes>
        <include>*:javadoc</include>
      </includes>
      <outputDirectory>docs</outputDirectory>
      <unpack>true</unpack>
      <useTransitiveDependencies>true</useTransitiveDependencies>
      <useProjectArtifact>false</useProjectArtifact>
      <useStrictFiltering>true</useStrictFiltering>
    </dependencySet>
  </dependencySets>
</assembly>

Ich bin mir nicht sicher, ob dies zufriedenstellend genug ist, aber zumindest funktioniert es und bringt das erwartete Ergebnis.

4voto

Martins Punkte 1161

Ich habe es so hinbekommen, dass es so funktioniert:

<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bundle</id>
<formats>
    <format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>

<moduleSets>
    <moduleSet>
        <!-- Collect JAR libraries -->
        <useAllReactorProjects>true</useAllReactorProjects>
        <binaries>
            <includeDependencies>true</includeDependencies>
            <outputDirectory>/</outputDirectory>
            <unpack>false</unpack>
        </binaries>
    </moduleSet>
    <moduleSet>
        <!-- Collect sources -->
        <useAllReactorProjects>true</useAllReactorProjects>
        <binaries>
            <includeDependencies>true</includeDependencies>
            <attachmentClassifier>sources</attachmentClassifier>
            <outputDirectory>/</outputDirectory>
            <unpack>false</unpack>
        </binaries>
    </moduleSet>
    <moduleSet>
        <!-- Collect javadoc -->
        <useAllReactorProjects>true</useAllReactorProjects>
        <binaries>
            <includeDependencies>true</includeDependencies>
            <attachmentClassifier>javadoc</attachmentClassifier>
            <outputDirectory>/</outputDirectory>
            <unpack>false</unpack>
        </binaries>
    </moduleSet>
</moduleSets>

Grundsätzlich habe ich ein moduleSet für die JARs, ein weiteres für die Quellen und ein weiteres für die Javadocs. Das Assembly wird im letzten Modul des Projekts erstellt. Hoffentlich hilft das.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X