普通web项目转为maven项目整理

本文介绍如何将一个普通的Web项目转换成Maven项目,包括Maven项目的目录结构、pom.xml配置详解,以及在转换过程中遇到的问题及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     现在越来越多的公司和团队开始使用maven来管理项目。对个人而言,之前一直不太喜欢maven结构的项目,需要配置pom.xml,每次打开IDE之后都需要加载maven,电脑配置低的话就卡半天,balabala。后来用得多了也就习惯了,就跟用Myeclipse用习惯了,再用IDEA时一样,估计是大多数人的通病,习惯于一个模式,没有外力就不想再更换(还不是因为懒,哈哈)。

     好了,言归正传,之前的时候接到个任务,需要把一个普通的web项目改成maven的,花了点时间就研究了研究。

1.maven结构

     maven结构的web项目目录如下:


根据maven项目“约定优于配置”的原则,其中./src/main/用于存放源代码,./src/test用于存放单元测试代码,./target用于存放编译、打包后的输出文件。按理说src/main/作为Source Folder就可以了,不过为了方便开发,通常会在main下面加上java和resources两个目录,其中java放置java代码,而resources文件夹存放相关配置文件)。

2.maven的配置都在pom.xml里面

2.1.pom.xml在改的时候我主要用到三个配置<dependencies>、<profiles>、<build>。

2.1.1.<dependencies>是项目引入插件所需要的额外依赖,主要是依赖的jar包。
<dependency>
			<!-- 项目或者组织的唯一标志,并且配置时生成路径也是由此生成 -->
			<groupId>junit</groupId>
			<!-- 项目的通用名称 -->
			<artifactId>junit</artifactId>
			<!-- 项目的版本 -->
			<version>4.11</version>
			<!-- 表示开发的时候引入,发布的时候不会加载此包,其他的还有compile(缺省值)、provided、runtime、system -->
			<scope>test</scope>
		</dependency>


2.1.2.因为改造前的项目的jar好多是框架私有包,在maven仓库没有,这时就需要将jar包install到本地maven仓库,
mvn install:intall-file -Dfile=myprivatejar.jar -DgroupId=com.cn.wddqz -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar


2.1.3.dependency的version里还可以用${junit.version}表示,然后再<properties>中加入<junit.version>4.11</junit.version>

2.2.profiles:在列的项目构建profile,用来激活不同的profile

因为项目有多个测试环境,所以根据不同的环境要有若干套配置文件,次时就需要多个profile,用来放置不同的配置文件。此时maven结构中的resouces就需
要有若干个文件夹了ceshi1_resouces、ceshi2_resouces、ceshi3_resouces等.
配置文件如下:
               <profile>
			<id>ceshi1</id>
			<properties>
				<package.environment>ceshi1_resouces</package.environment>
			</properties>
			<activation>
				<activeByDefault>true</activeByDefault> <!-- 设置默认打包那个环境下的配置文件 -->
			</activation>
			<build>
				<plugins>
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-war-plugin</artifactId>
						<version>2.4</version>
						<configuration>
							<!-- 包含空文件夹,指的是maven编译打包的时候会将空文件夹也编译打包进去,该参数2.4版本后才能使用 -->
							<includeEmptyDirectories>true</includeEmptyDirectories>
						</configuration>
					</plugin>
				</plugins>
			</build>
		</profile>


注:进行maven编译的时候需要加上" -P ceshi1 "

2.3.build构建项目需要的配置信息:

示例如下:
<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<!-- maven-compiler-plugin用来指定JDK版本和编码 -->
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.4</version>
				<configuration>
					<!-- 编译器的版本设定为1.6,应该指的是jdk,默认是用的1.3,版本太老 -->
					<source>1.6</source><!-- 源代码使用的开发版本 -->
					<target>1.6</target><!-- 需要生成的目标class文件的编译版本 -->
					 <!-- 一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中需要没有使用低版本jdk中不支持的语法),会存在target不同于source的情况 -->
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<!-- maven-war-plugin进行打包 -->
				<artifactId>maven-war-plugin</artifactId>
				<version>2.4</version>
				<configuration>
					<includeEmptyDirectories>true</includeEmptyDirectories>
					<!-- war包的名字 -->
					<warName>MavenDemo</warName>
					<webResources>
						<resource>
							<!-- package.environment就是profile中的配置文件路径 -->
							<directory>${project.basedir}/src/main/${package.environment}</directory>
							<targetPath>WEB-INF/classes</targetPath>
							<filtering>true</filtering>
						</resource>
					</webResources>
				</configuration>
			</plugin>
		</plugins>
	</build>

3.注意事项:

3.1.maven项目改造前,IDE里面需要装maven插件,本地配置maven的环境变量。
3.2.我是先新建了个maven的web项目,然后将原来web项目的源码拷贝到对应目录的方式实现的。

4.后记:

改造的时候只用到了以上的一些内容,基本上完成了任务,基于个人能力可能有些方面没考虑到,或者项目比较简单,而没有用到更复杂的知识,如果大家
有更好的案例,欢迎补充。


<think>好的,用户遇到了一个Spring框架中的异常:`HttpMessageNotWritableException: No converter for [class com.kotei.sdw.api.Result] with preset Content-Type 'text/event-stream;charset=UTF-8'`。我需要先理解这个异常的原因,然后给出解决方案。 首先,异常信息指出没有找到能够将`Result`类转换为对应Content-Type的转换器。Content-Type是`text/event-stream`,通常用于服务器推送事件(SSE)。这说明用户可能在使用Spring的响应流功能,比如通过`SseEmitter`或者返回`text/event-stream`类型的响应。 接下来,我要分析可能的原因。常见的可能性有几个: 1. **缺少对应的HttpMessageConverter**:Spring默认的转换器可能不支持将`Result`对象转换为`text/event-stream`格式。例如,默认的转换器如MappingJackson2HttpMessageConverter可能处理的是JSON格式,而这里需要的是文本格式。 2. **Content-Type设置不正确**:可能手动设置了Content-Type为`text/event-stream`,但返回的对象无法被正确序列化。例如,如果返回的是一个POJO,Spring会尝试用JSON转换器处理,但Content-Type不匹配导致失败。 3. **未正确配置SSE相关的处理**:如果使用SSE,可能需要使用特定的返回类型,如`SseEmitter`,而不是普通的对象。 然后,我需要逐步思考解决方法: - **检查返回类型和Content-Type是否匹配**:如果用户确实想返回SSE流,应该使用`SseEmitter`作为返回类型,并确保控制器方法返回的是它。同时,不需要手动设置Content-Type,Spring会自动处理。 - **检查自定义转换器**:如果确实需要将`Result`对象转换为`text/event-stream`格式,可能需要自定义一个HttpMessageConverter,并注册到Spring中。但这比较少见,通常SSE会以特定格式发送事件数据,而不是直接序列化对象。 - **调整响应格式**:如果用户希望返回JSON数据,但错误地设置了Content-Type为`text/event-stream`,应修正Content-Type为`application/json`,并确保有JSON转换器(如Jackson)在类路径中。 另外,需要确认用户是否在控制器方法中正确使用了SSE。例如,是否返回了`ResponseBodyEmitter`或`SseEmitter`,并且通过`Emitter.send()`方法发送数据。如果直接返回`Result`对象但Content-Type设置为SSE,会导致转换器找不到合适的处理方式,从而抛出异常。 可能的解决方案步骤: 1. **确认是否使用SSE**:如果是,修改控制器返回类型为`SseEmitter`,并正确发送事件数据。 2. **检查依赖**:确保项目中包含处理JSON的库(如Jackson),以便Spring能自动注册对应的转换器。 3. **自定义转换器(如必要)**:如果必须将Result转换为特定格式,编写自定义转换器并注册。 4. **调整Content-Type**:如果返回的是JSON,将Content-Type改为`application/json`。 现在需要将这些思路整理成用户容易理解的步骤,确保结构清晰,帮助用户一步步排查问题。</think>### 问题分析:`HttpMessageNotWritableException` 此异常表示 **Spring 找不到合适的消息转换器** 将返回对象 `com.kotei.sdw.api.Result` 转换为 `text/event-stream` 格式。常见原因如下: --- ### 1. **原因:`Content-Type` 与返回值类型不匹配** - **`text/event-stream`** 通常用于 Server-Sent Events (SSE) 场景,需通过 `SseEmitter` 返回流式数据。 - 若你的代码试图直接返回 `Result` 对象(如 JSON)但强制设置了 `Content-Type: text/event-stream`,会导致转换器冲突。 #### ✅ 解决方法: - **方案 1:改用 SSE 标准写法** 若需要 SSE 流,修改 Controller 方法返回类型为 `SseEmitter`,按 SSE 规范发送数据: ```java @GetMapping(path = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter streamData() { SseEmitter emitter = new SseEmitter(); // 通过 emitter.send(data) 发送事件 return emitter; } ``` - **方案 2:修正 Content-Type** 若需返回普通 JSON 数据,移除 `text/event-stream` 设置,使用默认的 `application/json`: ```java @GetMapping("/data") public Result getData() { return new Result(...); } ``` --- ### 2. **原因:缺少 JSON 消息转换器** 即使未使用 SSE,若项目中缺少 JSON 序列化库(如 Jackson),Spring 无法将 `Result` 转为 JSON。 #### ✅ 解决方法: - **添加 Jackson 依赖**(Maven): ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency> ``` --- ### 3. **原因:自定义消息转换器未生效** 若已自定义 `HttpMessageConverter` 但未注册到 Spring,或优先级不够。 #### ✅ 解决方法: - **显式注册转换器**: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new YourCustomConverter()); // 自定义转换器 } } ``` --- ### 总结步骤 1. **明确需求**:确认是否需要 SSE 流(`text/event-stream`)还是普通 JSON。 2. **调整代码**:按需求选择 `SseEmitter` 或修正 `Content-Type`。 3. **检查依赖**:确保 Jackson 存在。 4. **验证配置**:检查自定义转换器是否注册成功。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值