經過springboot快速構建jar包,這個輕量級的jar能夠很方便的部署至任一有java環境的服務器,便於測試。html
經過eclipse-mars新建一個spring starter project項目。java
1. 在eclipse的嚮導中,新建2.1.5.RELEASE版本的springboot項目,由於選項中包含這個,但是完成以後,在pom.xml的第一行報一個Unknow的錯誤,在problems中顯示spring
Description Resource Path Location Type
Unknown pom.xml /myproject line 1 Maven Configuration Problemjson
百思不得其解,後面發現將其改爲2.1.4.RELEASE便可。windows
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
考慮應該是eclipse的bug,固然也有多是個人環境的問題。springboot
2. 通常新建一個springboot項目都會添加Web依賴,而後通常爲了測試springboot項目是否正常,會寫一個HelloController,這裏要注意幾個容易搞錯的註解。bash
@Controller @RestController服務器
@GetMapping @PostMappingmvc
其實我這裏主要說的就是@Controller @RestController這兩個註解:app
@Controller public class HelloController { @RequestMapping("/hello") public String hello() { return "hello"; } }
這樣去訪問localhost:8080/hello獲得的是以下錯誤
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri May 17 16:34:41 CST 2019 There was an unexpected error (type=Internal Server Error, status=500). Circular view path [hello]: would dispatch back to the current handler URL [/hello] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
是由於hello()方法返回的hello其實會去找hello.html(這裏根據使用的什麼模板,好比用thymeleaf能夠配置.html的視圖)的頁面,由於springmvc的視圖解析會自動加上默認的後綴,就像咱們通常會配置的prefix suffix WEB-INF .jsp等信息。
因此這裏就用到@RestController這個註解,能夠看到它裏面實際上是包含了@ResponseBody這個註解,也就是將hello方法的return的字符當成json直接返回,而不用進行視圖解析。只須要替換以下就能夠,固然GetMapping能夠很方便的知道這是一個get請求,不像RequestMapping還須要經過屬性來區分。
@RestController public class HelloController { @GetMapping("/hello") public String hello() { return "hello"; } }
這時,訪問localhost:8080/hello,頁面返回了hello字符串,顯示正常。
3. 因爲用到了靜態資源文件,代碼中須要讀取文件流,一開始我用絕對路徑,在本地測試沒有問題,可是打成jar包丟到服務器去運行時,發現報錯:E:/ssm/workspace-mars/myproject/src/main/resources/static/certs/key-store.p12資源找不到。
打開jar包,發現static資源目錄在BOO-INF/classes/static/
起初用到ResourceUtils工具類,對應於org.springframework.util.ResourceUtils,用到的方法org.springframework.util.ResourceUtils.getFile("classpath:key-store.p12");
後面還用到ClassPathResource類,ClassPathResource resource = new ClassPathResource("key-store.p12");
而後就能夠直接獲取InputStream。
1.File file= ResourceUtils.getFile("classpath:key-store.p12"); 2.ClassPathResource classPathResource = new ClassPathResource("key-store.p12"); 獲取文件:classPathResource .getFile(); 獲取流:classPathResource .getInputStream(); #這裏注意,若是文件不在根目錄下,須要用相對路徑,好比static/certs/key-store.p12 #經過網上查閱資料,知道springboot項目,經過第一種方式在windows下能夠實現,可是放到Linux系統中就找不到File,因此最好是用第二種方式,而後用getInputStream()流的方式來讀取文件。
4. springboot項目從1.5開始不支持log4j,僅支持log4j2。這裏須要配置。
通常日誌咱們採用slf4j在項目中使用接口來調用,而不用關心具體實現類,代碼以下:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(ClassName.class);
通常咱們採用log4j做爲實現,只須要配置一個log4j.properties文件