Home > Software engineering >  Maven deploy:deploy-file publishes all files instead of one
Maven deploy:deploy-file publishes all files instead of one

Time:08-17

I am building my Java application using Maven and the Maven Assembly Plugin to create an executable jar.

As a result, the target folder contains multiple jars and other files. However, I only want to deploy the executable jar file built via the Assembly Plugin.

To do this, I have tried to use mvn deploy:deploy-file and provided it with the following properties:

  • file
  • repositoryId
  • url
  • artifactId
  • groupId
  • version

However, when I execute the command, Maven deploys all files instead of only the executable jar.

I also tried disabling the default build step:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-deploy-plugin</artifactId>
    <executions>
        <!-- disable standard deploy -->
        <execution>
            <id>default-deploy</id>
            <phase>none</phase>
        </execution>
    </executions>
</plugin>

The build part of my pom.xml looks like this:

  <build>
    <!--suppress UnresolvedMavenProperty -->
    <finalName>${project.artifactId}-${BUILD_DATE}</finalName>
    <sourceDirectory>src</sourceDirectory>
    <resources>
      <resource>
        <directory>src</directory>
        <filtering>true</filtering>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>main.PAtrackMain</mainClass>
              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
            <manifestEntries>
              <!--suppress UnresolvedMavenProperty -->
              <Implementation-Build>${BUILD_DATE}</Implementation-Build>
            </manifestEntries>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <appendAssemblyId>true</appendAssemblyId>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
        <executions>
          <!-- disable standard deploy -->
          <execution>
            <id>default-deploy</id>
            <phase>none</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

How can I deploy only the executable jar without the other files?

CodePudding user response:

That is much simpler than you might think. There are two kinds of artifacts, produced by maven project:

  • main: ${artifactId}-${version}.${packaging} - this one you would like to not publish
  • supplemental: everything else produced by plugins (javadoc, sources, assembly, etc)

If project/module packaging is pom, that means following:

Thus, all what you need is:

  • switch module packaging from jar to pom
  • enable missing plugins: maven-compiler-plugin, maven-resources-plugin, maven-jar-plugin, etc
  • extra configuration of maven-deploy-plugin is not required
  • Related