赞
踩
分为两步:
这一块比较简单,主要目的是为了将项目依赖的jar和项目本身代码分开打包
<plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <!--这里是为了将依赖拷贝出来,不打包到项目代码的jar中--> <id>copy-dependencies</id> <phase>prepare-package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!--存放依赖jar的文件位置,这里配置成在target/lib下--> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!--不拷贝间接依赖的jar,这里配置成false,表示拷贝间接依赖--> <excludeTransitive>false</excludeTransitive> <!--去掉依赖jar的版本号,这里不去掉,方便jar的更新同步--> <stripVersion>false</stripVersion> <!--包含jar的scope范围,此处设置为compile,打击可以根据需要调整--> <includeScope>compile</includeScope> </configuration> </execution> </executions> </plugin>
这个文件在项目代码打完包的META-INF/MANIFEST.MF。作用是记录jar的Main入口类和所依赖的jar的位置。可以通过解压打完包的jar查看。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <!--主要是为了向添加MANIFEST.MF中添加必要的内容,如下--> <manifest> <mainClass>com.xxx.xxx.Application</mainClass> <!-- 入口程序 --> <addClasspath>true</addClasspath> <!-- 添加依赖jar路径,这个大家解压打包后的项目jar, 可以观察一下MANIFEST.MF文件内容就明白了 --> <!-- 自己动手丰衣足食,实践出真知 --> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> </configuration> </plugin>
所谓的快速同步,其实就是通过代码自动ssh到服务器上,获取服务器上的jar列表,和本地的jar列表进行比较,将新增的jar拷贝到服务器上,并将服务器上过期的jar删掉的过程。(这里使用Java,基于jsch实现,直接上代码)
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
<scope>test</scope>
</dependency>
package sync_lib; import cn.hutool.core.io.FileUtil; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import java.util.*; import java.util.stream.Collectors; /** * @author xchen */ public class SyncLib { private static Session session; private static ChannelSftp channelSftp; //只打印日志,不做上传删除操作(debug用) private static final Boolean onlyPrint = true; public static void main(String[] args) throws Exception { //初始化ssh连接 initChannel(); try { //cd 到服务器上的jar包所在目录 channelSftp.cd("服务器的lib目录(jar所在目录)"); //将jar目录下的jar都ls出来,保存到oldJarList中 Vector ls = channelSftp.ls("."); List<String> oldJarList = new ArrayList<>(); for (int i = 0; i < ls.size(); i++) { ChannelSftp.LsEntry o = (ChannelSftp.LsEntry) ls.get(i); String filename = o.getFilename(); if (filename.endsWith(".jar")) { oldJarList.add(filename); } } //这个是intellij idea中分离打包后的lib的路径, 大家可以直接改成自己本地的绝对路径 String newLibPath = SystemUtil.get(SystemUtil.USER_DIR) + "/target/lib/"; //获取本地最新jar的列表 List<String> newLibList = FileUtil.listFileNames(newLibPath); //对比新老jar列表,找出要新增的jar,删除的jar List<String> addJarList = addJarList(oldJarList, newLibList); List<String> removeJarList = removeJarList(oldJarList, newLibList); //上传新增的jar for (String addJarName : addJarList) { if (onlyPrint) { channelSftp.put(newLibPath + addJarName, addJarName); } System.out.println("add jar ==> " + addJarName); } //删除过期的jar for (String removeJarName : removeJarList) { if (onlyPrint) { channelSftp.rm(removeJarName); } System.out.println("remove jar ==> " + removeJarName); } } finally { //关闭ssh连接 closeChannel(); } } public static List<String> removeJarList(List<String> oldLibList, List<String> newLibList) { Set<String> newLibSet = new HashSet<>(newLibList); return oldLibList.stream().filter(item -> !newLibSet.contains(item)).collect(Collectors.toList()); } public static List<String> addJarList(List<String> oldLibList, List<String> newLibList) { Set<String> oldLigSet = new HashSet<>(oldLibList); return newLibList.stream().filter(item -> !oldLigSet.contains(item)).collect(Collectors.toList()); } public static void initChannel() throws JSchException { //声明JSCH对象 JSch jSch = new JSch(); //获取一个Linux会话 session = jSch.getSession("root", "服务器IP", 22); //设置登录密码 session.setPassword("服务器密码"); //关闭key的检验 Properties sshConfig = new Properties(); sshConfig.put("StrictHostKeyChecking", "no"); session.setConfig(sshConfig); //连接Linux session.connect(); //通过sftp的方式连接 channelSftp = (ChannelSftp) session.openChannel("sftp"); channelSftp.connect(); } private static void closeChannel() { if (channelSftp != null) { channelSftp.disconnect(); } if (session != null) { session.disconnect(); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。