Maven : Deploy Local Project to Remote Server with dependencies

Mehdi LAMRANI :

I know this can sound very noobish and I apologize for that.

My question is simple :

I developed a project locally, it contains many external dependencies that are referred to in the pom.xml file. When I deploy on the remote server using mvn deploy, only the application jar is deployed, but not its dependencies.

So I end-up with java.lang.NoClassDefFoundError when I try to execute my program on the remote server.

What do I need to do to make this work in a proper way ?

EDIT : I would rather avoid ending up with a massive sumo jar with all dependences in it. I would prefer to export the dependencies separately to the remote server (if that makes sense)

EDIT 2: Is there a way to "Mavenize" the remote server and execute Maven Dependency lookup directly from there ? And only deploy my "real" jar when I update the code ?

I will have a look at the maven-dependency-plugin with the dependency:copy-dependencies mojo. Looks interesting.

Below my pom.xml : jar-with-dependencies did not work (I must have missed something)

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com</groupId>
<artifactId>zylon</artifactId>
<version>HBaseConnect</version>
<name>BaseConnect</name>

<dependencies>  
    (...)               
</dependencies>  

    <distributionManagement>
        <repository>
            <id>ssh-repository</id>
            <url>scpexe://remote.server/cloud/repo</url>
         </repository>
     </distributionManagement>

      <build>     
      <plugins>       
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>zylon.myMainClass</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
            </configuration>
            </plugin>

        </plugins>

        <extensions>
          <extension>
            <groupId>org.apache.maven.wagon</groupId>
             <artifactId>wagon-ssh-external</artifactId>
             <version>1.0-beta-6</version>
          </extension>
        </extensions>

      </build>
</project>

The shade plugin below worked though, but it results in a massive Jar file.

             <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                  <execution>
                    <phase>package</phase>
                    <goals>
                      <goal>shade</goal>
                    </goals>
                    <configuration>
                      <artifactSet>
                        <excludes>
                          <exclude>classworlds:classworlds</exclude>
                          <exclude>junit:junit</exclude>
                          <exclude>jmock:*</exclude>
                          <exclude>*:xml-apis</exclude>
                          <exclude>org.apache.maven:lib:tests</exclude>
                        </excludes>
                      </artifactSet>
                    </configuration>
                  </execution>
                </executions>
              </plugin>
Marco R. :

You can achieve this using the maven-assembly-plugin and configuring it to use the jar-with-dependencies descriptor.

You can find examples and more details of this here

EDIT: Make sure to define an execution goal for your plugin and invoke such goal correctly; either by:

  1. Specifying the fully-qualified goal mvn groupId:artifactId:version:goal (you can check how to shorten this reference here)

OR

  1. Attaching the goal to the desired maven phase (such as package). In your particular case:
   <project>
      [...]
      <build>
        [...]
        <plugins>
          <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id> <!-- this is used for inheritance merges -->
                <phase>package</phase> <!-- bind to the packaging phase -->
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          [...]
    </project>

As showcased in the original link I attached (https://maven.apache.org/plugins/maven-assembly-plugin/usage.html)

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=143226&siteId=1