本文記錄從 Maven 環境配置到 SSM (Spring + SpringMVC + MyBatis) 整合的完整流程,針對 Eclipse 常見坑點提供解決方案,助你快速搭建企業級 Java Web 專案骨架。
mvn -version 顯示版本資訊即成功<settings>
<localRepository>D:/dev/maven_repo</localRepository> <!-- 本地倉庫路徑 -->
<mirrors>
<mirror>
<id>aliyun</id>
<name>Aliyun Maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation><activeByDefault>true</activeByDefault></activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</profile>
</profiles>
</settings>
| 現象 | 原因 | 解決方案 |
|---|---|---|
| 專案結構缺少 src/main/java 等目錄 | 原型建立失敗 | 手動建立標準目錄結構,右鍵專案 → Build Path → Use as Source Folder |
| pom.xml 報錯:web.xml 缺失 | Dynamic Web Module 3.0+ 支援無 web.xml | 右鍵專案 → Properties → Project Facets → 勾選 Dynamic Web Module 3.1,或在 web.xml 中設定 metadata-complete="false" |
| JRE 版本不匹配 | 專案預設 JRE 為 1.5 | Properties → Java Build Path → Libraries 移除 JRE System Library,重新加入 JDK 1.8;同時修改 .settings/org.eclipse.wst.common.project.facet.core.xml 中版本號 |
| Maven Dependencies 未生效 | Eclipse 快取問題 | 右鍵專案 → Maven → Update Project → 勾選 Force Update |
<!-- 父模組 dependencyManagement -->
<properties>
<spring.version>5.3.21</spring.version>
<mybatis.version>2.2.2</mybatis.version>
<mybatis-spring.version>2.0.7</mybatis-spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis-spring.version}</version></dependency>
<!-- 資料庫驅動、連線池、日誌等 -->
</dependencies>
</dependencyManagement>
<!-- 掃描 Service、DAO、Component --> <context:component-scan base-package="com.example"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 資料源 + 事務管理 --> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">...</bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
<mvc:annotation-driven/> <context:component-scan base-package="com.example.controller"/> <!-- 靜態資源處理 --> <mvc:resources mapping="/static/**" location="/static/"/> <mvc:default-servlet-handler/> <!-- 視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 檔案上傳 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"/> </bean>
<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee" version="3.1">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter> <!-- 字元編碼過濾器 --> </filter>
<filter-mapping>...</filter-mapping>
</web-app>