普通java web项目转为maven项目

以前写的老项目,转为maven项目管理,关键是涉及的jar比较多,手动改工作量太大。

项目环境:eclipse、jdk8、jetty嵌入式启动。

1.创建一个新的maven项目。

2.拷贝源码。

将老项目src目录下的源码拷贝到新项目的src/main/java目录下。

3.拷贝WebRoot等其他文件夹。

4.(关键)配置pom.xml。添加相应的依赖。

原有的jar如果要手动配置maven依赖的话,涉及到170多个jar,工作量大,而且很多jar都比较旧了,相关依赖可能比较难找,并且容易导致jar冲突或者版本不一致导致系统不问题。

针对上面问题,我的解决办法是直接将需要的jar重新安装到maven仓库去,统一这些jar的groupId,然后在生成对应的pom.xml依赖配置。具体实现参考MavenUtil.java 

package com.xpl.util;import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**** Maven工具包* @author xpl 2024-10-19*/
public class MavenUtil {/**** 执行cmd命令* @param command  如  cmd /c systeminfo* @return*/public static String cmd(String[] command, String charsetname ) {charsetname = charsetname == null ? "GBK" : charsetname;Runtime runtime = Runtime.getRuntime();InputStream is = null;ByteArrayOutputStream byteArrayOutputStream = null;try {Process process = runtime.exec(command);is = process.getInputStream();byteArrayOutputStream = new ByteArrayOutputStream();byte[] buff = new byte[2048];int len;while((len = is.read(buff)) != -1) {byteArrayOutputStream.write(buff, 0, len);}return  byteArrayOutputStream.toString(charsetname);} catch (IOException e) {e.printStackTrace();}finally {if(byteArrayOutputStream != null){try {byteArrayOutputStream.close();} catch (IOException e) {e.printStackTrace();}}if(is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}}return null;}/**** jar安装到本地maven仓库* @param filePath* @param groupId* @param artifactId* @param version* @return*/public static boolean installJar(String filePath, String groupId, String artifactId, String version){String command = "mvn install:install-file -Dfile="+filePath+"    -DgroupId="+groupId+"   -DartifactId="+artifactId+"      -Dversion="+version+"    -Dpackaging=jar";boolean flag = true;String rs = "";try{rs = cmd(new String[]{"cmd", "/C", command}, "GBK");
//			System.out.println(rs);if(rs != null && rs.indexOf("BUILD SUCCESS")>= 0){flag = true;}else{flag = false;}}catch (Exception e) {flag = false;e.printStackTrace();}if(flag){System.out.println("安装成功:" +artifactId);}else{System.err.println("安装失败:" +artifactId);System.err.println(rs);}return flag;}/**** 批量安装jar* @param list* @return*/public static boolean installJars(List<String> list){for (String string : list) {String filePath = "F:\\workspace\\javaFX\\xpl\\" + string.replace('/', '\\');String groupId = "xpl.jfinal";String artifactId = string.substring(string.lastIndexOf('/')+1, string.lastIndexOf('.'));String version = "1.0.0";installJar(filePath, groupId, artifactId, version);}return true;}/**** 获取普通java web项目的依赖jar包列表。* @param classpath* @return*/public static List<String> getJars(String classpath){File oldFile = new File(PathUtil.getProjectPath() + "/.classpath");FileInputStream fis = null;InputStreamReader isr = null;BufferedReader br  = null;List<String> list = new ArrayList<String>();try{//文件读取流fis= new FileInputStream(oldFile);isr=new InputStreamReader(fis, "UTF-8");br = new BufferedReader(isr);String line = "";String[] arrs = null;while ((line=br.readLine())!=null) {if(line.indexOf("kind=\"lib\"") != -1 ){list.add(RegexUtil.findString(line, "path=\"(.*?)\"", 1));}}} catch (IOException e) {e.printStackTrace();}finally {close(br);close(isr);close(fis);}return list;}/**** 生成maven的依赖配置* @param list* @return*/public static String getPOM(List<String> list){StringBuffer sb = new StringBuffer();for (String string : list) {String groupId = "xpl.jfinal";String artifactId = string.substring(string.lastIndexOf('/')+1, string.lastIndexOf('.'));String version = "1.0.0";sb.append("<dependency>\n");sb.append("	<groupId>"+groupId+"</groupId>\n");sb.append("	<artifactId>"+artifactId+"</artifactId>\n");sb.append("	<version>"+version+"</version>\n");sb.append("</dependency>\n");}return sb.toString();}public static void close(Closeable obj){if(obj != null){try {obj.close();} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {//安装到本地String filePath = "${项目路径}\\.classpath";installJars(getJars(filePath ));//生成maven依赖配置System.out.println(getPOM(getJars(filePath )));}}

先安装jar到本地maven,然后将生成的依赖配置拷贝的新项目的pom.xml中。

5.测试。

启动测试正常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode配色主题推荐:Andromeda !

vscode配色主题推荐:Andromeda ! 图标库 vscode-icons ! Andromeda:Dark theme with a taste of the universe&#xff1b; 仙女座&#xff1a;一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSearc…

判断自己的mac是macOS x64 还是macOS ARM64

在终端输入 uname -a 这样的是x64 这样的是ARM64

Skydel 24.9版本震撼发布,升级五大关键功能

在信号传播与仿真领域&#xff0c;Skydel软件一直是行业内的佼佼者。我们与您分享升级快讯&#xff0c;Skydel软件24.9.0版本已正式发布&#xff0c;此次更新不仅带来了五大全新功能&#xff0c;还在性能优化、用户体验以及远程API方面进行了全面升级&#xff0c;为用户带来更高…

面试题:如何能够保证T2在T1执行完后执行,T3在T2执行完后执行?——CountDownLatch原理

CountDownLatch的使用方式 CountDownLatch用于某个线程等待其他线程执行完任务再执行&#xff0c;与thread.join()功能类似。常见的应用场景是开启多个线程同时执行某个任务&#xff0c;等到所有任务执行完再执行特定操作&#xff0c;如汇总统计结果。 面试题&#xff1a;如何…

最新Java零基础知识(持续更新中......)

1. 学习前的准备 一个好的学习方法&#xff08;如何更高效学习&#xff09;&#xff1a; 成为一名合格的程序员&#xff0c;需要具备两个关键能力&#xff1a; 指法速度&#xff1a;高效的代码输入速度。编程思想&#xff1a;能够用编程的方式解决现实问题的能力。 指法速度&am…

SpringBoot中的Component和ComponentScan注解工作原理

Spring IoC 容器的工作是通过管理对象的生命周期和配置来保持业务逻辑清晰&#xff0c;但是 Spring 容器并不会自动知道要管理哪些 bean。所以我们来告诉 Spring 应该处理哪些 bean 以及如何处理&#xff0c;很简单这就是 Spring 的 Component 和 ComponentScan 注释的作用所在…

算法题总结(二十)——并查集

并查集理论基础 并查集常用来解决集合连通性问题&#xff0c;两个节点在不在一个集合&#xff0c;也可以将两个节点添加到一个集合中。 大白话就是当我们需要判断两个元素是否在同一个集合里的时候&#xff0c;我们就要想到用并查集。 并查集主要有两个功能&#xff1a; 将…

linux介绍与基本指令

前言 本次博客将会讲解linux的来源历史、linux操作系统的理解以及它的一些基本指令。 1.linux的介绍 linux的来源 linux的来源最初还是要说到unix操作系统的。 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作…

C语言 | Leetcode C语言题解之第502题IPO

题目&#xff1a; 题解&#xff1a; #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX_INT_NUMBER 0x7FFFFFFEtypedef struct {int capital;int profit; } ProNode;int CompareProfit(const ProNode *a, const ProNode *b) { /* 从大到小排序 */return b->pr…

根据发生异常的汇编指令以及函数调用堆栈,从内存的角度出发,估计出问题的可能原因,确定排查方向,快速定位C++软件问题

目录 1、前言 2、初步分析dump文件 3、加载更多模块的pdb文件&#xff0c;可能能看到更多行的函数调用堆栈 4、从内存的角度去看&#xff0c;估计是访问了野指针导致的&#xff0c;沿着这个怀疑的方向快速地定位了问题 5、最后 C软件异常排查从入门到精通系列教程&#xf…

力扣OJ算法题:合并两个有序链表

—————————————————————————————————————————— 正文开始 OJ算法题&#xff1a;合并两个有序链表 思路 创建一个新的空链表&#xff08;可以用malloc优化&#xff09;和两个指针L1、L2分别指向两个链表&#xff0c;遍历两个链表&am…

Chromium 中chrome.contextMenus扩展接口实现分析c++

一、chrome.contextMenus 使用 chrome.contextMenus API 向 Google Chrome 的上下文菜单中添加项。您可以选择从右键菜单中添加的对象类型&#xff0c;例如图片、超链接和页面。 权限 contextMenus 您必须在扩展程序的清单中声明 "contextMenus" 权限&#xff0c…

R语言机器学习算法实战系列(十二)线性判别分析分类算法 (Linear Discriminant Analysis)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍LDA的原理LDA的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve保存模型总结优点:缺…

Ubuntu(22.04)本地部署Appsmith

Ubuntu&#xff08;22.04&#xff09;安装Appsmith 简要介绍 Appsmith 是一个开源的低代码开发平台&#xff0c;旨在帮助开发者和非开发者快速构建定制化的内部应用程序和管理工具。通过直观的拖拽界面和丰富的预配置组件&#xff0c;Appsmith 让用户无需编写大量代码即可创建…

Postman使用-基础篇

前言 本教程将结合业界广为推崇和使用的RestAPI设计典范Github API&#xff0c;详细介绍Postman接口测试工具的使用方法和实战技巧。 在开始这个教程之前&#xff0c;先聊一下为什么接口测试在现软件行业如此重要&#xff1f; 为什么我们要学习Postman&#xff1f; 现代软件…

数据轻松上云——Mbox边缘计算网关

随着工业4.0时代的到来&#xff0c;工厂数字化转型已成为提升生产效率、优化资源配置、增强企业竞争力的关键。我们凭借其先进的边缘计算网关与云平台技术&#xff0c;为工厂提供了高效、稳定的数据采集与上云解决方案。本文将为您介绍Mbox边缘计算网关如何配合明达云平台&…

基于SpringBoot微信小程序的书院预约系统【附源码】

基于SpringBoot微信小程序的书院预约系统 效果如下&#xff1a; 微信小程序首页界面 用户登录界面 书院信息界面 会议室界面 管理员登录界面 管理员主界面 用户界面 书院信息界面 会议室界面 会议室预约界面 研究背景 随着社会的快速发展&#xff0c;计算机技术的影响是全面…

SpringBoot 单元测试 - 登录认证在 Spring Boot 上的标准单元测试写法。

&#x1f449; 请投票支持这款 全新设计的脚手架 &#xff0c;让 Java 再次伟大&#xff01; 不要使用 SpringBootTest 使用 SpringBootTest 进行单元测试会启动整个 Spring Boot 容器&#xff0c;并引入整个项目的 development&test 依赖。缺点是速度慢、体积大、测试目标…

HarmonyOS Next应用开发——图像PixelMap变换

【高心星出品】 图像变换 图片处理指对PixelMap进行相关的操作&#xff0c;如获取图片信息、裁剪、缩放、偏移、旋转、翻转、设置透明度、读写像素数据等。图片处理主要包括图像变换、位图操作&#xff0c;本文介绍图像变换。 图形裁剪 // 裁剪图片 x&#xff0c;y为裁剪的起…

【element-tiptap】如何把分隔线改造成下拉框的形式?

当前的分隔线只有细横线这一种形式 但是咱们可以看一下wps中的分隔线&#xff0c;花里胡哨的 这些在wps里都需要使用快捷键打出来&#xff0c;真没找到菜单在哪里 那么这篇文章咱们就来看一下如何改造分隔线组件&#xff0c;改造成下拉框的形式&#xff0c;并且把咱们想要的分…