Maven打包项目

文章介绍了使用Maven的各种插件进行Java项目打包的方法,包括普通打包、将依赖打包进jar以及创建包含依赖的lib目录。特别地,文章详细阐述了Nacos服务如何进行定制化打包,通过maven-assembly-plugin和自定义assembly描述文件实现方便的脚本启动方式。

以下演示几种打包的方式,利用pom的插件完成的。如果想熟练的完成项目打包,就研究一下插件吧。实际打包 就是 把项目编译完成后,把各种依赖的文件 汇总在一起 再生成一个 压缩包。压缩包的目录结构,可以灵活配置。

  • 普通java项目打包

这种打包方式,仅仅把项目文件打包编译,项目依赖的第三方包 并没有打包起来。这个时候执行,会报找不到依赖的CLASS。 如果需要执行成功,需要指定 classpath:

java -Djava.ext.dirs="%JAVA_HOME%jre\lib\ext;D:\x;D:\y" -jar test-1.0-SNAPSHOT.jar

需要注意的是,路径目录下一级就是.jar文件;比如D:\x 目录下 就是 x.jar ,D:\y目录下就是 y.jar

举例,把日志相关的jar包加到classpath中如下操作:

java -Djava.ext.dirs="%JAVA_HOME%jre\lib\ext;D:\Repository\org\slf4j\slf4j-api\1.7.31;D:\Repository\ch\qos\logback\logback-core\1.2.11;D:\Reposity\ch\qos\logback\logback-classic\1.2.11" -jar test-01-1.0-SNAPSHOT.jar

<plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.wxj.AppLOGBACK</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>

  • 普通java项目打包,并将依赖的jar同时打到生成的jar包中

maven-assembly-plugin 这种方式,会把项目依赖的jar包的所有的 .class文件,都打到生成的jar包中。

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.xxx.yyyy</mainClass> <!-- 主方法类 -->
            </manifest>
          </archive>
          <!-- get all project dependencies -->
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <!-- bind to the packaging phase -->
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

  • 普通Java项目打包,将依赖包放入 target/lib文件夹中

maven-jar-plugin 这种方式,只是把依赖包 copy到了 目标目录下的 lib文件中

 <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib</classpathPrefix>
              <mainClass>com.xxx.yyy</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
      <!-- 将依赖的jar拷贝到target/lib目录下 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>
                ${project.build.directory}/lib
              </outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>

  • 普通Java项目打包,将依赖包放入 lib文件夹中

maven-jar-plugin 这种方式会将 依赖包 都copy 到 生成的jar包中的 lib中

<plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <classpathPrefix>classes/lib/</classpathPrefix>
              <mainClass>com.xxx.yyy</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
      <!-- 将依赖的jar拷贝到target/lib目录下 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>
                ${project.build.directory}/classes/lib
              </outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>

  • 定制化打包

这是 nacos的文件目录,进入bin目录,执行 startup.sh 或者 startup.cmd 命令,就可以运行 nacos服务了。 那么,这是怎么做到的呢?

一般我们 编写了 spring boot 项目后, 直接打包,会得的一个 jar,然后运行 java -jar xxx.jar 来 运行这个spring boot 项目。

但是,对与 像 nacos 这种 服务,直接提供一个 脚本启动,是必要的。

因此,在打包 naocs 项目时,就得定制化打包。

pom.xml 文件中 引入 打包插件:

                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <configuration>
                            <descriptors>
                                <descriptor>release-nacos.xml</descriptor>
                            </descriptors>
                            <tarLongFileMode>posix</tarLongFileMode>
                        </configuration>
                        <executions>
                            <execution>
                                <id>make-assembly</id>
                                <phase>install</phase>
                                <goals>
                                    <goal>single</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
                <finalName>nacos</finalName>
            </build>

编写 插件描述文件:

<assembly>
    <id>server-${project.version}</id>
    <includeBaseDirectory>true</includeBaseDirectory>
    <formats>
        <format>dir</format>
        <format>tar.gz</format>
        <format>zip</format>
    </formats>
    <fileSets>

        <fileSet>
            <includes>
                <include>plugins/**</include>
            </includes>
        </fileSet>

        <fileSet>
            <includes>
                <include>conf/**</include>
            </includes>
        </fileSet>

        <fileSet>
            <includes>
                <include>bin/*</include>
            </includes>
            <fileMode>0755</fileMode>
        </fileSet>
    </fileSets>
    <files>
        <file>
            <source>LICENSE-BIN</source>
            <destName>LICENSE</destName>
        </file>
        <file>
            <source>NOTICE-BIN</source>
            <destName>NOTICE</destName>
        </file>
        <file>
            <!--打好的jar包名称和放置目录-->
            <source>../console/target/nacos-server.jar</source>
            <outputDirectory>target/</outputDirectory>
        </file>
    </files>

    <moduleSets>
        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>
            <includes>
                <include>com.alibaba.nacos:nacos-console</include>
            </includes>
        </moduleSet>
    </moduleSets>
</assembly>

可以看到,<file>标签,是把 console 模块的 jar包,也就是 spring boot 项目的jar包,copy到了定制化打包的 target目录下。然后 bin目录下 的脚本,直接启动 target目录下的 jar 就OK 了。

这就是 定制化 打包,使用 nacos 来简单说明其中的原理。

这种打包方式非常灵活,打包后,启动项目非常方便,只需要 执行 预先 提供的 脚本就可以了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值