ChatGPT解决这个技术问题 Extra ChatGPT

How to deploy SNAPSHOT with sources and JavaDoc?

I want to deploy sources and javadocs with my snapshots. This means that I want to automize the following command:

mvn clean source:jar javadoc:jar deploy

Just to execute:

mvn clean deploy

I don't want to have javadoc/sources generation executed during the install phase (i.e. local builds).

I know that source/javadoc plugins can be synchronized with the execution of the release plugin but I can't figure out how to wire it to the snapshots releases.


s
simon04
<build>
  <plugins> 
    <plugin>
      <artifactId>maven-source-plugin</artifactId>
      <executions>
        <execution>
          <id>attach-sources</id>
          <phase>deploy</phase>
          <goals><goal>jar-no-fork</goal></goals> 
        </execution>
      </executions>
    </plugin>
    <plugin> 
      <artifactId>maven-javadoc-plugin</artifactId> 
      <executions> 
        <execution> 
          <id>attach-javadocs</id>
          <phase>deploy</phase>
          <goals><goal>jar</goal></goals> 
        </execution> 
      </executions> 
    </plugin>
    <plugin> 
      <!-- explicitly define maven-deploy-plugin after other to force exec order -->
      <artifactId>maven-deploy-plugin</artifactId> 
      <executions> 
        <execution> 
          <id>deploy</id>
          <phase>deploy</phase>
          <goals><goal>deploy</goal></goals> 
        </execution> 
      </executions> 
    </plugin>
  </plugins> 
</build>

See Sonatype's OSS parent POM for a complete example.


I'm using this setup, and it works quite well. However I had two small issues: one, generated sources are not included in the "jar" goal, you'll need "jar-no-fork". Two, there is a bug in the release plugin that will cause to generate the release sources twice (and therefore deploeyed twice, which will lead to problems with repository managers)
maven-source-plugin:jar attaches to the package phase by default, so you could leave off <phase>verify</phase> and accomplish the same thing. Besides I'm not sure why you'd attach this to verify anyway as that phase is intended for "package the project and run integration tests".
@mglauche @matt thanks for your comments. I've just made the appropriate changes.
@Henryk Ok, I've explicitly added maven-deploy-plugin as well as maven seems (or tries) to guarantee execution in the oder the plugins are defined in the POM. It might require some experimenting though.
using random id creates new execution I thought you would want to "remap" the default one execution
D
Dave

The article referred to by Dan also mentions another approach that works without modifying poms AND won't go away anytime soon:

mvn clean javadoc:jar source:jar install

Which works fine with Maven 3+, along with...

mvn clean javadoc:jar source:jar deploy

Which I have tested from Jenkins deploying to Nexus.

This approach was nice because I only had to modify some Jenkins jobs and didn't need to mess with my poms.


Thanks for a pom-free solution! Note that javadoc:jar and/or source:jar must appear before install or deploy, or the extra jars won't be "attached" to the deployment.
FWIW these options also work with package: mvn clean javadoc:jar source:jar package
This is the good answer, since it tells you the exact command to build and upload sources and javadoc to your repo.
D
Dan

Just to add an alternative that doesn't require you to muck with plugin configuration:

mvn -DperformRelease=true [goals]

Credit goes to mcbeelen from http://sea36.blogspot.com/2009/02/attaching-javadocs-and-sources-to-maven.html?showComment=1314177874102#c6853460758692768998


I'd like to mention that this feature might go away in a future release of Maven (possibly Maven-4?). Check out the comment here in the Maven Super POM's profile section: maven.apache.org/ref/3.1.1/maven-model-builder/super-pom.html