Spring第二段
再一次安装
因为自己作死, 升级了high sierra, 然后, spotlights完蛋了. 导致重新安装macOS, 最后用了usb安装, 多次格式化硬盘, 强制降级到了sierra.
#### 绝对不用sdkman了, 那个货真不靠谱, 使用brew:
brew tap pivotal/tap #添加了一个搜索源(repo).
brew tap #可以查看源列表.
brew install springboot
#### brew描述: zsh completions have been installed to:
# /usr/local/share/zsh/site-functions
# 新开一个terminal, 一切正常的完美.
spring init --build=gradle #先执行这个. 拿到demo.zip
# 然后解压缩, 找到唯一的一个正常java(另外一个是test).
第一个spring
//一个groovy, groovy很简洁啊.
@RestController
class HelloController {
@RequestMapping("/")
def hello() {
return "Hello 哇嘎嘎嘎嘎"
}
}
//前面的都忽略, 不动他们.
@RestController //加了这句, 实践证明这行必须要.
@EnableAutoConfiguration //加了这句, 实践证明这行可以删除.
public class DemoApplication {
@RequestMapping("/") //加了这句
String home() {
return "Hello World!";
}
//后面的也忽略, 不理他们.
}
spring run demo
spring run demo #执行
open http://localhost:8080 #还是得到之前的报错.
spring run xxx.groovy #一样的报错, 顺便说一句, xxx.groovy或者xxx.java都没问题.
然后又想骂人, 竟然报错. 竟然报错. 坑死人啊.
报错一大坨:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7$1 (jar:file:/usr/local/Cellar/springboot/1.5.8.RELEASE/lib/spring-boot-cli-1.5.8.RELEASE.jar!/BOOT-INF/lib/groovy-2.4.12.jar!/) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v7.Java7$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
google瞬间得到答案: jdk9兼容问题.
https://github.com/spring-projects/spring-boot/issues/10445
https://github.com/magarena/magarena/issues/1368
一切又绕回来了, 我们还是需要sdkman安装java.
curl -s "https://get.sdkman.io" | zsh
### 这次不需要高complete了, 因为, 我们已经用brew安装了spring
### 等等, 我用brew 再次安装一下spring, 是不是就OK了? 试试吧.
brew reinstall springboot #失败了, 安装是好的, 但是, 依旧不能执行.
### 老实安装了sdkman, 但是新窗口也不行, 提示init没找到. 自己去看, 确实没有初始化的脚本.
rm -rf .sdkman # 删除之后, 再次安装, sdk正常了.
### 我们继续搞java吧.
sdk install java 8u151-oracle #版本号要写全了.
sdk list java #可以用这个查看支持的版本号.
http://www.jenv.be #这是一个专门管理java环境的工具, 有需要可以用.
brew cask info java # 这个能查看brew会安装的版本. 如何用brew安装老版本
brew cask install java6 #据说这样可以, 我试了, 不行.
brew cask install java@6 #据说这样可以, 我试了, 也不行.
brew switch node 0.6.5 #据说可以直接选版本. 因为本地没有版本, 所以这个没试过.
总之, 有折腾了一圈, 然后, 一切貌似都OK了. java………
有以下课题
- 测试, 单元测试.
- 热启动.
第一个正常项目
基本的情况
- springMVC 处理web请求
- thymeleaf web页面模板
- springDataJPA 持久化
- H2 数据库
- Gradle
spring init
spring init -dweb,data-jpa,h2,thymeleaf --build gradle readinglist
### 这个是指定更多参数的写法:
spring init -d=web -g=com.example -a=demo --package-name=com.example --name=demo -x
### 下面是解释:
-d(dependencies 依赖包)
-g(Group Id)
-a(Artifact Id)
--package-name(Package name)
--name(Project name)### 这个可以直接写名字, 可以省略--name
-x(Extract compatible archives)### 貌似这个不需要了. 变成默认行为了.
spring help init #这个命令可以看到更多的init的help
package readinglist;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//Enable component-scanning and auto-configuration, 之前判断这行可以删, 但是, 这张指明了自动配置生效.
@SpringBootApplication
public class ReadingListApplication {
public static void main(String[] args) {
//Bootstrap the application
SpringApplication.run(ReadingListApplication.class, args);
}
}
要点
-
@SpringBootApplication 这个是自动配置
-
grodle bootrun
我第一次执行这个, 提示我gradle找不到, brew install gradle gradle-completion
-
gradle build也行然后 java -jar
brew install gradle gradle-completion
grodle bootrun
### 此时报了bug, 仔细看, 原来是类名和文件名不一致, gradle报错机制还是不错的, java挺操蛋的, 就不该声明类名啊, 反正和文件名必须一致.
测试类
目录里面有个测试类, 可以测试接口.
疑问
- 我改了java. 加了@requestcontroller. 然后gradle bootrun就会失败, 但是, spring run是成功的.
- stackoverflow的解释是, gradle坏了.
配置文件 only you
- 配置文件只有一个了
- application.properties
- 也可能是application.yml 建议用这个更简洁.
命令行继续
spring jar xxx.jar first.groovy
java -jar xxx.jar --server.port=9090
yml , @value & bean
#application.yml
key:
hello: xxxxxx
//java @value 方式
@Value("${key.hello}")
private String hello;
//java p.java
@Component
@ConfigurationProperties(prefix = "key")
public class Person {
private String name;
private long sex;
public void setSex(String sex) {
try{
this.sex = Long.valueOf(sex);
}catch (Exception e){
this.sex = 0L;
}
}
public long getSex() {
return sex;
}
}
spring暂时告一段落, 老夫去弄groovy和kotlin了.