MyBatis及MyBatisPlus简单使用

MyBatis及MyBatisPlus简单使用 在做java开发的时候,我们经常会使用Mybatis来作为我们操作数据库的工具库,今天一步步带领大家集成到Spring boot中,本篇主要实现Spring boot+mybatis+MybatisPlus的基础使用 第一步创建Spring boot项目 大家使用自己熟悉的开发工具创建Spring boot项目。例如Idea、eclipse及SpringToolSuite4等工具,这里默认大家都已成功创建Springboot项目 配置pom.xml 这里使用的是mysql,大家根据自己情况配置相关的数据源 pom.xm `<?xml version=“1.0” encoding=“UTF-8”?> <project xmlns=“http://maven.apache.org/POM/4.0.0" xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!– lookup parent from repository –> </parent> <groupId>com.zdltech.test</groupId> <artifactId>mybatis</artifactId> <version>0.0.1-SNAPSHOT</version> <name>mybatis</name> <description>mybatis的测试</description> &lt;properties&gt; &lt;java.version&gt;1.8&lt;/java.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-jdbc&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis.spring.boot&lt;/groupId&gt; &lt;artifactId&gt;mybatis-spring-boot-starter&lt;/artifactId&gt; &lt;version&gt;2.1.0&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;mysql&lt;/groupId&gt; &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt; &lt;scope&gt;runtime&lt;/scope&gt; &lt;/dependency&gt; &lt;!-- 下面这个mysbatis-plus-boot-starter是配置Mybatis和MybatisPlus的依赖--&gt; &lt;dependency&gt; &lt;groupId&gt;com.baomidou&lt;/groupId&gt; &lt;artifactId&gt;mybatis-plus-boot-starter&lt;/artifactId&gt; &lt;version&gt;3.1.0&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.projectlombok&lt;/groupId&gt; &lt;artifactId&gt;lombok&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;druid-spring-boot-starter&lt;/artifactId&gt; &lt;version&gt;1.1.13&lt;/version&gt; &lt;/dependency&gt; &lt;/dependencies&gt; &lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt; &lt;/plugin&gt; &lt;/plugins&gt; &lt;/build&gt; </project> ` ...

2019年9月17日 · 5 分钟 · 天边的星星

一步一步带你构建Spring Cloud

​ Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。 Spring Cloud Netflix 是对Netflix开发的一套分布式服务框架的封装,包括服务的发现和注册,负载均衡、断路器、REST客户端、请求路由等。 Spring Cloud Config 将配置信息中央化保存, 配置Spring Cloud Bus可以实现动态修改配置文件 Spring Cloud Bus 分布式消息队列,是对Kafka, MQ的封装 Spring Cloud Security 对Spring Security的封装,并能配合Netflix使用 Spring Cloud Zookeeper 对Zookeeper的封装,使之能配置其它Spring Cloud的子项目使用 Spring Cloud Eureka Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能 ​ Spring cloud 是微服务架构的集大成者,将一系列优秀的组件进行了整合。 本章Spring cloud 使用,一步一步带你构建Spring cloud整个应用 构建Spring cloud服务端 构建Spring cloud 服务提供端 构建Spring cloud 消费端(服务调用端) 一、Spring Cloud 服务端 POM.xml 配置 `<project xmlns=“http://maven.apache.org/POM/4.0.0" xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!– lookup parent from repository –> </parent> <groupId>com.test.cloud</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> ...

2019年8月27日 · 5 分钟 · 天边的星星

Spring boot 读取properties

## Spring boot 读取properties 在开发中我们需要通过属性文件配置常用属性,例如数据库相关、日志相关、测试相关等。 自定义properties文件获取属性 application.properties获取属性 ### 自定义properties文件获取属性 使用@configurationProperties((prefix=”xxx.yyy”)) 和 @PropertySource(“classpath:xxxconfig.properties”) xxx.yyy表示的是属性文件中的前缀(有时候我们希望可以分的更清楚) 使用自定义的时候需要给类添加@Component 让Spring管理类的生命周期 在使用的地方使用@Autowired 让系统进行初始化 // PropertySource默认取application.properties // @PropertySource(value = “xxxconfig.properties”) 例如 “` @Component @ConfigurationProperties(prefix = “com.xxx”) @PropertySource(“classpath:myconfig.properties”) public class TestBean { private String host; public String getHost() { return host; } public void setHost(String host) { this.host = host; } } //使用地方 @Autowired private TestBean testBean “` ### application.properties获取属性 共有三种 参考上面自定义 只是不用设置PropertySource PropertySource默认取application.properties 使用@Value注解 使用Environment #### 使用@Value ...

2019年7月11日 · 2 分钟 · 天边的星星

Spring boot 事务回滚

在Controller中添加 @Transactional 自己捕获异常之后事务不能回滚 原因: 默认spring事务只在发生未被捕获的 RuntimeException 时才回滚 spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获 RuntimeException 的异常,但可以通过配置来捕获特定的异常并回滚 换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚 解决方案 例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理 在controller层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常 例如 try{ *//出现异常* } catch (Exception e){ e.printStackTrace(); //设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); }

2019年6月20日 · 1 分钟 · 天边的星星

Spring boot过滤器 Filter使用

过滤器Filter ** 过滤器是基于Servlet的拦截,是在Web容器进行拦截。常用的场景有登录、权限判断、tonken过滤等。当然使用拦截器也可以,拦截器是基于Spring的拦截,可以作用于Controller等的方法中。如果是Web的话,没有特别要求,还是使用过滤器吧(本人观点) 编写过滤器 新建过滤器 需要实现javax.servlet.Filter接口,并重新其中的方法 public class LoginFilter implements Filter { ` @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } @Override public void destroy() { } }` HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; 可以转换为我们平时使用的HttpServletRequest 和 HttpServletResponse 如果不需要过滤 直接调用 filterChain.doFilter(servletRequest, servletResponse); 如果需要过滤 根据自己的业务处理 例如:判断token、ip等,直接通过HttpServletResponse 返回异常处理 重定向跳转 response.sendRedirect(request.getContextPath()+&#8221;/*.html&#8221;); 界面返回response.getWriter().write(this.NO_LOGIN); String requestType = request.getHeader(&#8220;X-Requested-With&#8221;); //判断是否是ajax请求 if(requestType!=null && &#8220;XMLHttpRequest&#8221;.equals(requestType)) 过滤器配置 配置方式有2中,一种是通过注解,一种是通过过滤器配置 一、注解方式配置 在过滤器上添加WebFilter注解 ...

2019年6月14日 · 1 分钟 · 天边的星星

Spring Boot 过滤器和拦截器总结

![请输入图片描述][1]### 拦截器与过滤器的区别 过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。 SpringMVC的机制是由DispaterServlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的. 过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,动态代理是拦截器的简单实现。 ** 过滤器就是过滤的作用,在web开发中过滤一些我们指定的url 那么它能帮我们过滤什么呢? 那功能可就多了: 比如过拦截掉我们不需要的接口请求 修改请求(request)和响应(response)内容 完成CORS跨域请求等等 最简单明了的区别就是 <strong>过滤器可以修改request,而拦截器不能过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境拦截器可以调用IOC容器中的各种依赖,而过滤器不能过滤器只能在请求的前后使用,而拦截器可以详细到每个方法** 过滤器就是筛选出你要的东西,比如requeset中你要的那部分 拦截器在做安全方面用的比较多,比如终止一些流程 何时使用拦截器?何时使用过滤器? 如果是非spring项目,那么拦截器不能用,只能使用过滤器。 如果是处理controller前后,既可以使用拦截器也可以使用过滤器。 如果是处理dispaterServlet前后,只能使用过滤器。 过滤器:它依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等 拦截器:它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是直接访问静态资源的请求则没办法进行拦截处理。 两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。 Spring boot使用过滤器 使用spring boot提供的FilterRegistrationBean注册Filter 使用原生servlet注解定义Filter 两种方式的本质都是一样的,都是去FilterRegistrationBean注册自定义Filter 方式一 先定义Filter ` import javax.servlet.*; import java.io.IOException; public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // do something 处理request 或response System.out.println("filter1"); // 调用filter链中的下一个filter filterChain.doFilter(servletRequest,servletResponse); //如果过滤通过,执行filterChain.doFilter(servletRequest,servletResponse); 不通过就执行直接返回 } @Override public void destroy() { } }` 注册自定义Filter `@Configuration public class FilterConfig { @Bean public FilterRegistrationBean registrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter()); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } }` 方式二 `@Component // 定义filterName 和过滤的url @WebFilter(filterName = "my2Filter" ,urlPatterns = "/*") public class My2Filter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("filter2"); filterChain.doFilter(servletRequest,servletResponse); //如果过滤通过,执行filterChain.doFilter(servletRequest,servletResponse); 不通过就执行直接返回 } @Override public void destroy() { } }` Spring boot 拦截器的使用 定义拦截器: `public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true;////如果false,停止流程,api被拦截 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("afterCompletion"); } }` 配置拦截器: `@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()); } }` Controller演示: `@RestController public class UController { @GetMapping("/home") public String home(){ System.out.println("home"); return "myhome"; } } 输出: preHandle home postHandle afterCompletion`

2019年5月24日 · 2 分钟 · 天边的星星

关于HttpUrlConnection请求网络加载证书与不加载证书的区别

测试的3个网址分别为: String uri1 = “https://mportal.tianjihuifu.com/tjhf/loginRegist/login?uname=13265468238&pwd=123456”; String uri2 = “https://mportal.tjhf.com/tjhf/loginRegist/login?uname=13265468238&pwd=123456”; String uri = “https://www.baidu.com/”; 中间用到的证书为cer_test.crt,证书信息为:CN=console.haitest.com, C=CN。分别测试了加载证书与不加载证书请求3个不同的网址的日志。 证书为cer_test.crt,没有HostnameVerifier E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 证书为cer_test.crt,HostnameVerifier :return true E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 证书为cer_test.crt,HostnameVerifier :return hostname.equals(session.getPeerHost()) E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 证书为null,没有HostnameVerifier E/==####DROXY####===: (**)发送请求(get):https://mportal.haitest.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)发送请求(get):https://mportal.hai.com/hai/loginRegist/login?uname=13265468238&pwd=123456 E/==####DROXY####===: (**)响应结果:{“data”:72771,”result”:true,”resultCode”:2000} E/==####DROXY####===: (**)发送请求(get):https://www.baidu.com/ E/==####DROXY####===: (*_*)响应结果: ...

2019年5月21日 · 5 分钟 · 天边的星星

SpringBoot消失的Web.xml

Filter 过滤器作为web.xml中重要的一部分,有着相当高的出场率,SpringBoot会默认注册几个Filter ApplicationContextHeaderFilter CharacterEncodingFilter 如果添加了Security依赖的话会加入SpringSecurityFilterChain 如果加入Actuator依赖的话就会加入WebRequestTraceFilter 实现自己的Filter JavaConfig注册Bean 我们如果自己要实现自己的Filter的话,需要实现Filter并实现其中的方法 同时要利用JavaConfig的方法来配置,一般情况下需要编写@Bean注解的返回值为FilterRegistrationBean的方法来实现JavaBean的注册 具体实现如下 需要注意的是此方法需要在被@Configuration注解的配置类中 @WebFilter+@ServletComponentScan 如果觉得Java代码的方式比较繁琐的话可以采用注解方式注册Filter,具体实现方式是在Filter实现类加入@WebFilter注解 例如 然后在SpringBootApplication类上添加@ServletComponentScan Filter的注册原理 我们采用JavaConfig的形式实现了Filter的注册,通过向上追溯得知FilterRegistrationBean的层级结构如下 ServletContextInitializer RegistrationBean AbstractFilterRegistrationBean FilterRegistrationBean 经查阅SpringBoot文档发现针对ServletContextInitializer的描述如下 Interface used to configure a Servlet 3.0+ context programmatically. Unlike WebApplicationInitializer, classes that implement this interface (and do not implement WebApplicationInitializer) will not be detected by SpringServletContainerInitializer and hence will not be automatically bootstrapped by the Servlet container. This interface is primarily designed to allow ServletContextInitializers to be managed by Spring and not the Servlet container. ...

2019年3月19日 · 1 分钟 · 天边的星星

Mybatis Generator 无法生成selectByPrimaryKey、deleteByPrimaryKey、updateByPrimaryKey MySQL

问题现象: 最近因为一张表新加了字段,重新使用 mybatis-generator 生成了一下mapper文件,结果发现新生成的文件比之前少了xxxByPrimaryKey 的几个方法,对应的xml文件中同样也少了这几个, 并且xml文件中的resultMap节点里主键id使用的是result标签,而不是id标签。 排查原因: 首先想到的是:难道表没有主键了,于是赶紧检查了一下我的表结构,发现主键没有问题呀!表结构并没有大的变化,我仅仅是加了一个普通字段而已,那怎么会这样呢? 然后我又检查了generatorConfig.xml中table项中的属性 enableSelectByPrimaryKey=”true” enableUpdateByPrimaryKey=”true” enableDeleteByPrimaryKey=”true” 看看这几个属性是否被设置成了false,默认的值是true。 发现也没有问题,这里配置也没有改动过! 唯一想到的变化是mysql连接器版本进行了升级: mysql mysql-connector-java 5.1.35 /** 升级版本 **/ mysql mysql-connector-java 8.0.11 将版本改回去重新试了下果然就可以了。那么可以确信就是 mysql-connector-java 版本升级造成的问题! 解决方法: 很纳闷为什么升级了高版本反而有问题了呢,想到这既然是普遍问题,那应该别人早就遇到过这个问题了,网上搜了下,果然很多人在问这个问题。 最终看到一篇文章找到了解决方法: 在jdbcConnection节点里配置useInformationSchema属性,可以解决mybatis-generator不识别主键问题: 参考文章:https://my.oschina.net/u/2289161/blog/1589630 另外还看到有人说:如果使用的mysql驱动5.x版本的就可以生成,使用6.x 及以上的,那就无法生成了,必须显式设置:useInformationSchema=”true” 说明一下,我使用的maven插件版本是 1.3.5 org.mybatis.generator mybatis-generator-maven-plugin 1.3.5 src/test/resources/generatorConfig.xml true ——————— 参考:https://blog.csdn.net/rchm8519/article/details/81949916

2019年1月29日 · 1 分钟 · 天边的星星

命令行打包 war文件

根据自己项目的真实情况需要注意配置jdk环境,如果jdk环境不同可能造成打出的war包不能正常运行。例如 项目使用jdk1.7 打包使用javac必须为jdk1.7中的javac命令,tomcat需要配置执行的jdk环境为1.7。如果电脑使用的和项目使用的是同一个jdk,配置路径可以省略,其他情况不能省略。 命令行打包 war文件 echo 准备java文件 dir *.java/s/b > source.txt if exist out\classes ( echo 清理中… rd /S/Q out ) echo 清理中完成 md out\classes md out\webapp echo 编译源码 set JAVA_HOME=D:\Program Files\Java\jdk1.7.0_75 %JAVA_HOME%\bin\javac -cp .;E:\apache-tomcat-8.5.35\lib*;E:\apache-tomcat-8.5.35\bin*;E:\auto_test\zchfaxgb\src\main\webapp\WEB-INF\lib* -d out\classes -encoding utf-8 @source.txt echo 复制webapp目录 xcopy src\main\webapp out\webapp /s/e/i/y echo 创建编译源码路径 md out\webapp\WEB-INF\classes echo 复制classes目录 xcopy out\classes out\webapp\WEB-INF\classes /s/e/i/y echo 复制resources目录 xcopy src\main\resources out\webapp\WEB-INF\classes /s/e/i/y echo 开始打包 cd out\webapp echo 打包中 jar -cvf zcjf.war * move zcjf.war ../../ echo 打包完成 pause ...

2018年12月24日 · 1 分钟 · 天边的星星