通过maven可以把依赖的各种jar和自己的程序都打包成一个jar,这样在部署的时候就非常方便了,这点在做可执行的jar包时就更方便了。
这依赖一个maven的插件:shade
在pom里配置shade插件即可:
1 | <build> |
使用 mvn package
打包时,就可以把所有依赖的jar都打包到一个jar里了。要运行只需要 java -jar xxx.jar
不用在classpath参数里写一大堆jar了,是不是很方便?
shade插件还可以配置排除/包含某些jar包。
通过maven可以把依赖的各种jar和自己的程序都打包成一个jar,这样在部署的时候就非常方便了,这点在做可执行的jar包时就更方便了。
这依赖一个maven的插件:shade
在pom里配置shade插件即可:
1 | <build> |
使用 mvn package
打包时,就可以把所有依赖的jar都打包到一个jar里了。要运行只需要 java -jar xxx.jar
不用在classpath参数里写一大堆jar了,是不是很方便?
shade插件还可以配置排除/包含某些jar包。
不用spring,仅仅jms和activeMQ
1 | <?xml version="1.0" encoding="UTF-8"?> |
1 | package cn.devmgr.activemqlistener; |
1 | package cn.devmgr.activemqlistener; |
1 | <dependency> |
最好再建个子目录,这样资源更方便管理。
使用模板调格式会方便很多(宽度、字体、数字格式等等,节省代码,容易修改)
下面的例子是写在spring controller内的,如果不是controler,需要变化的只有只有最后返回的部分。
1 | @ResponseBody |
改成继承org.springframework.boot.web.servlet.support.SpringBootServletInitializer, 例如:
1 | package cn.devmgr.tutorial; |
1 | <packaging>war</packaging> |
1 | <dependency> |
spring boot 2.0项目需要在tomcat 8.5以上版本环境下运行
classpath:位置 | 项目中的目录 | 优先级 |
---|---|---|
/META-INF/resources/ | src/main/resources/META-INF/resources/ | 优先级最高 |
/resources/ | src/main/resources/resources/ | 第二优先 |
/static/ | src/main/resources/static/ | 第三优先 |
/public/ | src/main/resources/public/ | 第四优先 |
如果项目中没有@EnableWebMvc注解,那么上述静态资源是可以直接被浏览器访问的,如果项目中有@EnableWEbMvc注解,则无法访问了。
这是因为SpringBoot默认启动了自动配置,自动配置配置上述静态资源的访问,而使用@EnableWebMvc注解后,会禁止掉org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 的自动配置,于是这些不能被访问了。
如果需要@EnableWebMvc注解,又需要静态资源,增加一个自定义的配置:
1 | @Configuration |
logback是spring boot中的默认日志记录框架,spring推荐使用logback-spring.xml来做配置,loback-spring.xml可以放置到src\main\resources目录下。
通过在logback-spring.xml中配置不同的pfofile,可以实现不同的profile不同的日志记录方式,下面是一个例子。
1 | <?xml version="1.0" encoding="UTF-8"?> |
需要注意:有logback配置文件后,application.yml中的日志配置部分就失效了。
1 | location / { |
修改application.yml
1 | server: |
之后在程序中获取的IP (request.getRemoteAddr()
) 就是真实的IP地址了。
在使用Spring REST时,有一个需要返回xml格式数据的方法:
1 | @PostMapping(value = "/payment", consumes = {MediaType.TEXT_XML_VALUE}, produces = {MediaType.ALL_VALUE}) |
被调用时”org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘text/xml;charset=UTF-8′ not supported”异常。
[http-nio-8085-exec-7] ERROR c.s.m.r.e.ControllerExceptionHandler - 异常:415
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/xml;charset=UTF-8' not supported
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:226)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:157)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:131)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:870)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
乍一看似乎是consumes指定的content-type不对导致,实际上是缺少依赖导致,spring rest默认只包含json格式的转换,不包含xml格式的转换,因此pom内增加依赖来解决。
1 | <dependency> |
增加上述依赖后,上面的方法会正常访问,但如果RestController上没有指明produces,增加上述依赖后,会默认输出xml,而不再是json。
可以通过
1 | @Configuration |
来修改默认的produces。
使用jackson来实现json和object之间转换。
使用的时候在resultMap中,对应的列配置,例如:
1 | <result column="specs" property="specs" |
1 | update table_xxx |
1 | package cn.devmgr.tutorial.typehandler; |
在调用https的外部接口时,遇到一个异常:
Caused by: java.lang.RuntimeException: Could not generate DH keypair
at sun.security.ssl.ECDHCrypt.<init>(ECDHCrypt.java:82)
at sun.security.ssl.ClientHandshaker.serverKeyExchange(ClientHandshaker.java:724)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:281)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
... 103 common frames omitted
Caused by: java.security.InvalidAlgorithmParameterException: parameter object not a ECParameterSpec
at org.bouncycastle.jce.provider.JDKKeyPairGenerator$EC.initialize(Unknown Source)
at sun.security.ssl.ECDHCrypt.<init>(ECDHCrypt.java:77)
... 110 common frames omitted
发现maven打包依赖时加入org.bouncycastle:bcprov-jdk14导致,老版本的bcp只支持1024位加密,遇到2048位加密就出这个异常了。
有两个办法解决,推荐第一个,彻底解决:
* 找到依赖org.bouncycastle:bcprov-jdk14的配置,用exclusion排除它,并加入最新的bcprov。
* 在java命令行加参数: -Dcom.sun.net.ssl.enableECC=false
我的项目出错是由于itextpdf-5.0依赖了bcprov-jdk14,升级到itextpdf-5.5.13并增加了对bcprov-jdk15的依赖。 由于itextpdf-5.5.13中对bcprov-jdk15的依赖是optional,需要另外增加bcprov-jdk15
1 | <dependency> |