再一次安装

因为自己作死, 升级了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………

有以下课题

  1. 测试, 单元测试.
  2. 热启动.

第一个正常项目

基本的情况
  1. springMVC 处理web请求
  2. thymeleaf web页面模板
  3. springDataJPA 持久化
  4. H2 数据库
  5. 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);  
}

}
要点
  1. @SpringBootApplication 这个是自动配置

  2. grodle bootrun

    我第一次执行这个, 提示我gradle找不到, brew install gradle gradle-completion

  3. gradle build也行然后 java -jar

brew install gradle gradle-completion
grodle bootrun 
### 此时报了bug, 仔细看, 原来是类名和文件名不一致, gradle报错机制还是不错的, java挺操蛋的, 就不该声明类名啊, 反正和文件名必须一致.
测试类

目录里面有个测试类, 可以测试接口.

疑问
  1. 我改了java. 加了@requestcontroller. 然后gradle bootrun就会失败, 但是, spring run是成功的.
  2. 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了.