How To: Eclipse Maven install build jar with dependencies

前端 未结 1 1064
有刺的猬
有刺的猬 2020-12-07 16:50

I am using Eclipse Maven (m2e) inside Eclipse and I am running my project like this:

My pom.xml looks like this:



        
相关标签:
1条回答
  • 2020-12-07 17:35

    There are a couple of ways of doing this.

    1) If you want an uber-jar (repacked with all dependencies), look into using and configuring the maven-shade-plugin:

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.6</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
                <configuration>
                  <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                      <mainClass>com.group.id.Launcher1</mainClass>
                    </transformer>
                  </transformers>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    

    This will unpack all dependencies and merge them into one JAR file.


    2) If you want to deliver a bundle (zip, tar.gz, etc) with the unpacked JAR files in the bundle (perhaps under lib/) then you need to look into the maven-assembly-plugin:

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.3</version>
            <executions>
              <execution>
                <id>create-distro</id>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
                <configuration>
                  <descriptors>
                    <descriptor>src/main/assembly/dist.xml</descriptor>
                  </descriptors>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    

    Note that this requires an assembly descriptor src/main/assembly/dist.xml and example looks like this:

    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0">
      <id>distribution</id>
      <formats>
        <format>zip</format>
      </formats>
    
      <dependencySets>
        <dependencySet>
          <useProjectArtifact>false</useProjectArtifact>
          <useTransitiveDependencies>false</useTransitiveDependencies>
          <unpack>false</unpack>
          <scope>runtime</scope>
          <fileMode>0755</fileMode>
          <directoryMode>0755</directoryMode>
          <outputDirectory>bin</outputDirectory>
    
          <includes>
            <include>com.group.id:project-launch1</include>
            <include>com.group.id:project-launch2</include>
          </includes>
    
        </dependencySet>
        <dependencySet>
          <useProjectArtifact>false</useProjectArtifact>
          <useTransitiveDependencies>true</useTransitiveDependencies>
          <unpack>false</unpack>
          <scope>runtime</scope>
          <fileMode>0644</fileMode>
          <directoryMode>0755</directoryMode>
          <outputDirectory>lib</outputDirectory>
    
          <includes>
            <include>com.group.id:project-lib1</include>
            <include>com.group.id:project-lib2</include>
            <include>com.group.id:project-lib3</include>
            <include>com.group.id:project-lib4</include>
          </includes>
    
        </dependencySet>
      </dependencySets>
    </assembly>
    

    And since you are now assembling dependencies, you have better define the dependency in the pom.xml, like so:

      <dependencies>
        <dependency>
          <groupId>com.group.id</groupId>
          <artifactId>project-launch1</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <type>jar</type>
        </dependency>
        <dependency>
          <groupId>com.group.id</groupId>
          <artifactId>project-launch2</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <type>jar</type>
        </dependency>
        <dependency>
          <groupId>com.group.id</groupId>
          <artifactId>project-lib1</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <type>jar</type>
        </dependency>
        ... and so on ...
      </dependencies>
    


    3) If you are delivering a bundle with an executable JAR file launcher, you will likely need to add a maven-jar-plugin configuration in addition to the maven-assembly-plugin:

      <dependencies>
        <dependency>
          <groupId>com.group.id</groupId>
          <artifactId>project-lib1</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <type>jar</type>
        </dependency>
        <dependency>
          <groupId>com.group.id</groupId>
          <artifactId>project-lib2</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <type>jar</type>
        </dependency>
        <dependency>
          <groupId>com.group.id</groupId>
          <artifactId>project-lib3</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <type>jar</type>
        </dependency>
        ... and so on ...
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
              <archive>
                <addMavenDescriptor>false</addMavenDescriptor>
                <compress>true</compress>
                <manifest>
                  <mainClass>com.group.id.Launcher1</mainClass>
                  <addClasspath>true</addClasspath>
                  <classpathPrefix>../lib/</classpathPrefix>
                </manifest>
              </archive>
            </configuration>
          </plugin>
        </plugins>
      </build>
    

    Note that the "addClasspath" directive adds the project dependencies to the class path. This is needed for JAR launchers, as they explicitly ignore all CLASSPATH environmental variables.

    0 讨论(0)
提交回复
热议问题