Maven+Mybatis+Spring+Spring MVC +Mysql在Myeclipse2017下运行Tomcat 报错/异常汇总
Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)
2018-04-30
肯定是maven依赖包冲突或者包下载不完整或者其他文件问题,反正肯定是文件问题!!!
这个类型的错误困扰我2天,第一天以为是自己配置环境的时候缺乏经验,没有仔细研究报错原因,放弃搭建的所有环境。
第二天按原来的步骤创建新的ssm架构项目,没有采用分布式开发方式,jdk设置为1.8版本,运行tomcat依然报错,很郁闷,我就擦擦啊!!!
瞬间怀疑自己能力,不行,我要求助万能的互联网,结果找来找去都是那几种解决办法,而且也不尽正确,然后我索性把maven仓库清掉,重新下载,重新maven——update project,重新Run As Maven Test,然后又重新加载了依赖包,然后Run As ——Tomcat,bingo,这是最笨的也是最彻底的解决办法,不过还是有人有方法能查到具体哪个包出问题,在这里借鉴一下,如下:
“TOMCAT 启动报错 invalid LOC header (bad signature),网上好多人说自己的项目中某个jar文件损坏或者是jar文件版本冲突了,但是我的工程中没有报哪个jar文件出错了,所以可以通过
JDK下rt.jar/java/util/jar/JarFile.class下424行privatebyte[] getBytes(ZipEntry ze)throwsIOException {try(InputStream is =super.getInputStream(ze)) {returnIOUtils.readFully(is, (int)ze.getSize(),true); }}try位置前打个点,Debugger看他读取的每个jar包名称建议:第一次先快速F8过一遍,有时候控制台会有些内容显示出来,可以已此为记号,第一遍大概记住报错的位置,第一次可以快速来到附近,一个一个查看
这个方法中打断点,看看加载哪个jar包的时候报错了,这样就能确定到底哪个jar包有问题了,其实还有个简单的方法就是将所有Jar包删掉,重新从manven服务器上下载
参考连接:http://www.jianshu.com/p/0e8d0f59fe37”
上面提到的学习环境:SSM+Mysql5.7+Eclipse2017+JDK1.8+Tomcat8.5
学习例子:http://blog.csdn.net/v123411739/article/details/50742885
动机
使用maven已经有一段时间了,但项目是别人搭建好的,因此一直想着自己要学习搭建一下。网上找了些资料后,结合自己实验,花了点时间就搞好,老样子,写在博客上,免得日后忘记。
本文链接:http://blog.csdn.net/v123411739/article/details/50742885
博文中的MyEclipse链接:https://pan.baidu.com/s/1pMhiygz 密码:mqmc
博文中的完整项目代码:关注微信公众号发送“SSM”即可获得。
注:文末有直接导入项目的方法。
1.安装maven和配置(此步骤并非必须,可以根据情况选择)
进入官网下载中心http://maven.apache.org/download.cgi,下载apache-maven-3.5.2-bin.zip,**-src.zip为Maven的源码
配置环境变量,打开系统环境变量新建一个M2_HOME将解压后的Maven存放路径放在此,然后在path路径加入%M2_HOME%\bin路径
检测是否配置成功,打开命令行输入echo %M2_HOME%查看M2_HOME指向的Maven存放安装目录是否正确,输入mvn -v查看是否能找到正确的mvn执行脚本
以后升级的话将M2_HOME的路径换为最新的安装目录就行
Maven实践:初次安装完后输入mvn help:system的命令,此时会打印出所有的Java系统属性和环境变量,然后Maven会执行一个真正的任务将相应的所需的构件下载到本地仓库中包括pom和jar文件,然后用户在C:\Users\Administrator\.m2下就能看到本地仓库了
用户需要复制M2_HOME/conf/setting.xml文件到C:/Users/Administrator/.m2/setting.xml,这样用户每次升级后就不要在次修改setting.xml文件了
在本地创建一个文件夹MavenRepository,并在MavenRepository文件夹下创建文件夹repository。
进入Maven解压后的文件夹,进入conf文件夹,将settings.xml文件复制到上一步创建的MavenRepository文件夹下
打开MavenRepository文件夹下的settings.xml文件,找到localRepository标签,此时是被注释掉的,我们解除注释,然后配置步骤1中的repository路径,如F:\m2\repository
在MyEclipse中的Perferences进行如下配置,添加自己的Maven
User Settings设置为之前修改过的setting.xml
File->New->others,搜索maven,如果看到有Maven Project则代表配置成功。
1、创建一个maven项目
2、按照上面教程,即可创建出一个Maven项目,项目结构如下图
3、将JRE版本设置为1.7,可使用默认的或者自己导入
4、此时index.jsp会报以下错误
在pom.xml文件的dependencies节点下添加如下代码即可,添加完后,会下载对应的jar包
5、右键项目,选择Properties,进行如下配置
4.搭建Spring+SpringMVC+Mybatis框架
1、Maven引入项目用到的jar包,修改pom.xml后保存会自动下载,存放在之前配置的本地仓库中,即:F:\m2\repository文件夹
pom.xml
[html] view plain copy
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
com.chillax
Maven_Project
war
0.0.1-SNAPSHOT
Maven_Project Maven Webapp
http://maven.apache.org
4.0.2.RELEASE
3.2.8
1.7.12
1.2.17
junit
junit
4.11
test
javax
javaee-api
7.0
org.springframework
spring-test
${srping.version}
org.springframework
spring-core
${srping.version}
org.springframework
spring-oxm
${srping.version}
org.springframework
spring-tx
${srping.version}
org.springframework
spring-jdbc
${srping.version}
org.springframework
spring-aop
${srping.version}
org.springframework
spring-context
${srping.version}
org.springframework
spring-context-support
${srping.version}
org.springframework
spring-expression
${srping.version}
org.springframework
spring-orm
${srping.version}
org.springframework
spring-web
${srping.version}
org.springframework
spring-webmvc
${srping.version}
org.springframework
spring-aspects
${srping.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.2
mysql
mysql-connector-java
5.1.35
commons-dbcp
commons-dbcp
1.4
jstl
jstl
1.2
taglibs
standard
1.1.2
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
com.alibaba
fastjson
1.2.6
org.codehaus.jackson
jackson-mapper-asl
1.9.13
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4
commons-codec
commons-codec
1.10
net.sourceforge.jexcelapi
jxl
2.6
org.apache.poi
poi
3.8
org.apache.poi
poi-ooxml
3.9
Maven_Project
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
1.7
1.7
2、在src/main/resources下添加如下配置文件
applicationContext.xml
[html] view plain copy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
jdbc.properties,有多人反映直接复制时,第一行的driver最后面多了个空格,请注意
[html] view plain copy
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/maventest
username=root
password=root
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
log4j.properties
[html] view plain copy
#定义LOG输出级别
log4j.rootLogger=INFO,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File = logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
spring-dao.xml
[html] view plain copy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
可指定多个包,包与包之间用逗号或分号分隔-->
spring-db.xml
[html] view plain copy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
spring-tx.xml
[html] view plain copy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
spring-mvc.xml
[html] view plain copy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
web.xml
[html] view plain copy
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
Archetype Created Web Application
/index.jsp
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
true
encoding
UTF-8
encodingFilter
/*
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/spring-mvc.xml
1
true
SpringMVC
/
UserController.java
[java] view plain copy
package com.chillax.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.chillax.dto.User;
import com.chillax.service.IUserService;
@Controller
@RequestMapping("/user")
public class UserController {
@Resource
private IUserService userService;
@RequestMapping("/userList")
public String userList(HttpServletRequest request,Model model){
List uList = userService.getAllUser();
model.addAttribute("uList", uList);
return "userList";
}
@RequestMapping("/showUser")
public String showUser(HttpServletRequest request,Model model){
int userId = Integer.parseInt(request.getParameter("id"));
User user = userService.getUserById(userId);
model.addAttribute("user", user);
return "showUser";
}
@RequestMapping("/addUserUI")
public String addUserUI(){
return "addUser";
}
@RequestMapping("/addUser")
public String addUser(HttpServletRequest request,Model model){
User user =new User();
user.setName(String.valueOf(request.getParameter("name")));
user.setPassword(String.valueOf(request.getParameter("password")));
user.setAge(Integer.parseInt(String.valueOf(request.getParameter("age"))));
userService.addUser(user);
return "redirect:/user/userList";
}
}
IUserDao.java
[java] view plain copy
package com.chillax.dao;
import java.util.List;
import java.util.Map;
import com.chillax.dto.User;
public interface IUserDao {
public User queryByPrimaryKey(Integer id);
public List getAllUser();
public void insertUser(User user);
public void insertUserByBatch(List list);
public void deleteByPrimaryKey(Integer id);
public void delteUserByBatch(Map params);
public void updateByPrimaryKey(User user);
}
User.java
[java] view plain copy
package com.chillax.dto;
public class User {
private Integer id;
private String name;
private String password;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
UserMapper.xml
[html] view plain copy
id, name, password, age
parameterType="java.lang.Integer">
select
from user
whereid = #{id,jdbcType=INTEGER}
select
from user
insert into user
id,
name,
password,
age,
#{id,jdbcType=INTEGER},
#{name,jdbcType=VARCHAR},
#{password,jdbcType=VARCHAR},
#{age,jdbcType=INTEGER},
insert into USER
(ID,
NAME,
PASSWORD,
AGE)
select A.* from
(
select
#{user.id,jdbcType=INTEGER},
#{user.name,jdbcType=VARCHAR},
#{user.password,jdbcType=VARCHAR},
#{user.age,jdbcType=INTEGER}
from dual
) A
delete from user
whereid = #{id,jdbcType=INTEGER}
delete from user
where id IN
#{ids,jdbcType=DECIMAL}
update user
name = #{name,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR},
age = #{age,jdbcType=INTEGER},
whereid = #{id,jdbcType=INTEGER}
IUserService.java
[java] view plain copy
package com.chillax.service;
import java.util.List;
import com.chillax.dto.User;
public interface IUserService {
public User getUserById(int userId);
public void insertUser(User user);
public void addUser(User user);
public List getAllUser();
}
UserServiceImpl.java
[java] view plain copy
package com.chillax.service.Impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.chillax.dao.IUserDao;
import com.chillax.dto.User;
import com.chillax.service.IUserService;
@Service("userService")
public class UserServiceImpl implements IUserService {
@Resource
private IUserDao userDao;
public User getUserById(int userId) {
return userDao.queryByPrimaryKey(userId);
}
public void insertUser(User user) {
userDao.insertUser(user);
}
public void addUser(User user) {
userDao.insertUser(user);
}
@Override
public List getAllUser() {
return userDao.getAllUser();
}
}
5、在WEB-INF文件夹下创建jsp文件夹,并添加userList.jsp,showUser.jsp、addUser.jsp
userList.jsp
[html] view plain copy
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
Stringpath = request.getContextPath();
StringbasePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
">
My JSP 'showUser.jsp' starting page
-->
用户名称:${u.name}
用户年龄:${u.age }
addUser.jsp
[html] view plain copy
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
Stringpath = request.getContextPath();
StringbasePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
">
My JSP 'addUser.jsp' starting page
-->
userName:
password:
age:
showUser.jsp
[html] view plain copy
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
Stringpath = request.getContextPath();
StringbasePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
">
My JSP 'showUser.jsp' starting page
-->
${user.name }
[sql] view plain copy
create database maventest;
use maventest;
CREATE TABLE `user` (
`id`int(12) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
`age`int(9) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`password`,`age`) values (1,'admin','admin',22);
至此,框架搭建完成。
解答:http://www.mvnrepository.com/
解决:在MyEclipse的安装目录找到myeclipse.ini,将分配的堆内存加大
解答:在pom.xml添加以下代码即可,添加完代码就会自动下载好jar包
解答:这是由于jar包没有正确下载导致的,找到错误的jar包位置,将文件夹里的文件删掉,将pom.xml里该jar包的配置代码删除后再重新写上,让MAVEN重新下载jar包即可。
解答:
解答:将项目的jre版本换成1.7或者以上的版本即可
问题7:出现以下错误,并且已经确定jre是1.7版本或者以上版本。
解答:在pom.xml文件的的标签中加入以下代码,然后Update Project(参照问题5)
[java] view plain copy
Maven_Project
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
1.7
1.7
解答:请确认地址中的项目,跟项目中的Web Context-root地址一致。
解答:如果想直接导入代码需要先做文章开头的1和2两步,即用一个自己的新的仓库来存储jar包,不然容易跟已有的仓库配置冲突,导致jar包无法下载或下载不全。下图是我导入的过程,下载jar的过程比较慢,并且下载完了还报错,但是报错并不影响项目的正确运行。
—————END—————