Maven连同依赖一起打包

1,414 阅读1分钟

Maven, assembly-plugin的简单配置

问题展现

本地项目打包后,将 jar 包打入本地仓库。然后,供给其他项目使用,发现项目中的相关依赖包并未引入,而且其他项目在运行时出现错误 NoClassDefFoundError 问题。

本地项目引入logback依赖和maven-jar-plugin插件配置启动类

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
</dependency>
    .
    .
    .
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>org.example.App</mainClass>
            <addClasspath>true</addClasspath>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

项目使用依赖的api

image.png

mvn package打包产物如下

image.png

执行结果

image.png

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 项目的相关依赖并没有一起打包进来所以找不到

解决问题

maven 打包时,默认不会将第三方依赖包打进来。可以在 pom.xml 中添加maven-assembly 插件实现… 打出的包里 xxxx-with-dependencies.jar 就是包含依赖包。 有时候需要启动一些小服务(类似脚本, 处理完结束任务).

引入插件

可能这时候, 不会再用SpringBoot那么大费周章. 所以就需要用'main'方法启动服务了. 如何指定'主类', 并将外部引用的依赖一齐打入jar包呢? 可参考下面的pom.xml中的<build/>片段:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>org.example.App</mainClass>
                    </manifest>
                    <manifestEntries>
                        <Class-Path>.</Class-Path>
                    </manifestEntries>
                </archive>
                <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>

configuration中的manifest是配置启动类信息

打包产物

image.png

执行结果

image.png