Blog

密码和证书-数字签名概述及与数字证书的关系

数字签名是什么?

1、鲍勃有两把钥匙,一把是公钥,另一把是私钥。

2、鲍勃把公钥送给他的朋友们—-帕蒂、道格、苏珊—-每人一把。

3、苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。

4、鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。

5、鲍勃给苏珊回信,决定采用”数字签名”。他写完后先用Hash函数,生成信件的摘要(digest)。

6、然后,鲍勃使用私钥,对这个摘要加密,生成”数字签名”(signature)。

7、鲍勃将这个签名,附在信件下面,一起发给苏珊。

8、苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。

9、苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。

10、复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成”数字签名”,写信给苏珊,让苏珊用假的鲍勃公钥进行解密。

11、后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找”证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成”数字证书”(Digital Certificate)。

12、鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。

13、苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明”数字签名”是否真的是鲍勃签的。


原作者:David Youd

来自翻译:阮一峰

http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

原文网址:http://www.youdzone.com/signature.html

wordpress-配置cdn加速

闲鱼站长,推荐用 Cloudflare CDN加速,因为有免费加速套餐。

方法:

只需 网站默认的  dns 服务器 改成 cloudflare  的dns服务器就行了。

注意事项:

在控制面板的 Crypto 的加密选项中,需要将 ssl 的加密模式,从 flexible 改成 full。因为我的网站自身就是只能通过https访问了。

full的含义是,从浏览器到cdn,及cdn到网站主机都是ssl加密的,如果这个地方不修改的话。那么浏览器访问网站时就会一直 redirect,redirect,redirect,最终报错显示:重定向太多。这个时候我们用 pagespeed 测速一下就会报错:Lighthouse returned error: RPC::SERVER_ERROR: Client could not parse server reply; initialization error is 。。。

优化:

等cdn能够运行,网站可以正常访问时,就可以cloudflare控制面板中的speed 选项和 cache选项中进行配置和优化。

nginx配置文件-流量控制-域名跳转url重定向及https跳转问题

一、域名跳转方法 rewrite 和 return

Don’t feel bad here, it’s easy to get confused with regular expressions. In fact, it’s so easy to do that we should make an effort to keep them neat and clean. Quite simply, don’t add cruft.
BAD:

rewrite ^/(.*)$ http://example.com/$1 permanent;

GOOD:

rewrite ^ http://example.com$request_uri? permanent;

BETTER:

return 301 http://example.com$request_uri;

Look at the above. Then back here. Then up, and back here. OK. The first rewrite captures the full URI minus the first slash. By using the built-in variable $request_uri we can effectively avoid doing any capturing or matching at all.


return 语义更加明确,『到此为止』,结果就是 301 了。
正如你所说,正则匹配的性能损失;文中末尾也解释了『BAD』和 『GOOD』的区别

二、http域名跳转

跳转到本主机域名还是其他网站域名,都没有问题,不会报错。

server {
    listen 80;
    server_name .myolddomain.se;
    return 301 http://www.mynewdomain.se$request_uri;
}

三、https域名跳转

只能在本机配置的https域名中跳转,无法跳转到别家公司的https网站。因为https连接时,事先会读取网站证书。跳转的网站域名和本机提供的网站证书不匹配,导致浏览器报错。只能调转到本机的其他https网站,因为其他的https网站域名,本机已经提供了证书。

3.1 一个ip多个https网站

如果浏览器支持 TLS SNI 扩展:使用nginx -V 命令可以查看

server {
    listen X.X.X.X:443 ssl;
    ssl_certificate /path/to/myolddomain.cert;
    ssl_certificate_key /path/to/myolddomain.key;
    server_name .myolddomain.se;
    return 301 https://www.mynewdomain.se$request_uri;
}


server {
    listen X.X.X.X:443 ssl;
    ssl_certificate /path/to/mynewdomain.cert;
    ssl_certificate_key /path/to/mynewdomain.key;
    server_name .mynewdomain.se;

    [ ... ] # Your stuff

}

如果证书已经包含多个域名:

ssl_certificate /path/to/domain.cert;
ssl_certificate_key /path/to/domain.key;


server {
    listen X.X.X.X:443;
    server_name .myolddomain.se;
    return 301 https://www.mynewdomain.se$request_uri;
}


server {
    listen X.X.X.X:443;
    server_name .mynewdomain.se;

    [ ... ] # Your stuff

}

3.2不同ip多个https网站

server {
    listen X.X.X.X:443 ssl;
    ssl_certificate /path/to/myolddomain.cert;
    ssl_certificate_key /path/to/myolddomain.key;
    server_name .myolddomain.se;
    return 301 https://www.mynewdomain.se$request_uri;
}

server {
    listen Y.Y.Y.Y:443 ssl;
    ssl_certificate /path/to/mynewdomain.cert;
    ssl_certificate_key /path/to/mynewdomain.key;
    server_name .mynewdomain.se;

    [ ... ] # Your stuff

}

 

 

nginx配置文件-安全配置-https(ssl/tls)和http2的配置

前期准备

# 查看 nginx 是否已经安装及具体版本号 
sh-4.2# rpm -qa | grep -i nginx
nginx-1.12.2-1.el7_4.ngx.x86_64
# 查看 nginx 的安装目录
sh-4.2# rpm -ql nginx-1.12.2-1.el7_4.ngx.x86_64
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.12.2
/usr/share/doc/nginx-1.12.2/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx
sh-4.2#

将 证书相关 文件 放到 /etc/nginx/https_cert目录里。
新建这个https_cert目录,其实可以指定的别的目录,只要配置文件引用目录正确就行了。
https证书的获取,可以查看密码和证书-https(ssl/tls)之证书的概述及获取和网站部署

一、配置https的操作:

1.1、开启443 端口

listen  443  ssl;

1.2、添加密钥

备注:nginx  即可以 读取 crt 文件 也可以读取  pem 文件。

# 这里是 相对路径 ,绝对路径是 /etc/nginx/https_cert/huaijiujia_ca_chained.crt
# 因为 nginx的主配置文件路径是 /etc/nginx/nginx.conf 

# 证书文件,里面有公钥
ssl_certificate     https_cert/huaijiujia_ca_chained.crt;
# 私钥
ssl_certificate_key https_cert/huaijiujia_private.key;

(1)补充:ssl_client_certificate      /etc/ssl/certs/ca.crt;
这个是客户端证书文件,用来验证客户端的身份的,比如访问银行网站需要的K宝证书文件。一般的网站基本用不到。

(2)补充:一般申请的证书,会给出三个文件。

第一个是证书文件,里面有公钥。第二个是私钥。第三个是证书组文件,因为公钥是由中间机构签发的,一些浏览器可能不能识别,所以证书组就是为了证明从根证书到中间签发机构都是可信的。

SSLCertificateFile /etc/ssl/example_com.crt 
SSLCertificateKeyFile /etc/ssl/private/example_com.key 
SSLCertificateChainFile /etc/ssl/example_com.ca-bundle

在nginx配置文件中:只有ssl_certificate和 ssl_certificate_key ,所以需要将证书文件和证书组文件,组合在一起,生成一个证书链文件。

cat example_com.crt example_com.ca-bundle > example_com.chained.crt

记得一定要先将证书放在前面,然后将证书组放在后面。这样才能解析成功。
但是在实际生成过程中:证书链生成的还是有问题。实际用cat生成时,中间的

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

###  会合并成一行
-----END CERTIFICATE----------BEGIN CERTIFICATE-----

###  特别注意:切分的时候,每一行的格式都是统一的,前面都是 -----  五个破折号

下面举例,正确的证书链文件内容:

-----BEGIN CERTIFICATE-----
MIIFbDCCBFSgAwIBAgISA5WD5KQw2Su8QWrrv6G5nlVfMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xODExMjMxMDAwMjdaFw0x
OTAyMjExMDAwMjdaMB0xGzAZBgNVBAMTEnd3dy5odWFpaml1amlhLmNvbTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPB7xpQSEdD5ZvYU80fBiWaTRHa4
p1ONueojFD6NabMRMw2ct4PLHsiIt8z5hGF02JhKb/ZxLIIBh5dtqFxAy4OcYRWa
J+7Qi+1tgD695t0JkqsW/KGbbZtZRFHikhx4TTLyd5IWuEKjJA87+8ufgCv/zuEM
hpdqNs5YhjqrVNjLo5yIIwVWF4FRs3rkSqUthaw6bF3+ER5Cnlrmy4nM6t811KuS
aFAFU9ZpfxzbtFefVNZGn79CxMf9huvHUklJTZeUmtr8SkfRLSC8yclP2vW4l70G
EiT1UK7jPb+/x2qynnDMv+/EfYk3oJq1emTg1UNizLmKPAItWDhI50BGKa8CAwEA
AaOCAncwggJzMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUCG4SDRTDi0shGxdi/x7S
ZFrxaSswHwYDVR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwbwYIKwYBBQUH
AQEEYzBhMC4GCCsGAQUFBzABhiJodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5
cHQub3JnMC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5
cHQub3JnLzAtBgNVHREEJjAkgg5odWFpaml1amlhLmNvbYISd3d3Lmh1YWlqaXVq
aWEuY29tMEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYI
KwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBAYKKwYBBAHW
eQIEAgSB9QSB8gDwAHYAdH7agzGtMxCRIZzOJU9CcMK//V5CIAjGNzV55hB7zFYA
AAFnQDpiswAABAMARzBFAiEAyP9RowhmAeFy0FIw864vexsfEi7+I8eXXgRBgdma
lXACIFuyRLDwlDSymNcSibTq/RJt4AlYtVAs2zA9lOUOGwN4AHYAY/Lbzeg7zCzP
C3KEJ1drM6SNYXePvXWmOLHHaFRL2I0AAAFnQDpiuAAABAMARzBFAiEAtLhwBegO
6Hvo3lTzkb1OBW1pmI00QMalMyyp7a8l3DICICdx6IzPP8Q9Aj5nwHXr7TZId+ye
pT2ApN87VE74fiT8MA0GCSqGSIb3DQEBCwUAA4IBAQBJZ0dI9Uq8WzRagYaRZI3p
BelzOZ0ImRW3iipi/XBHFB3hXbEIMBvaPlzduZzYe70WRYJFkHTCdVWrUqhUuEv9
B0Q5ovW9KDcrDJVw7C9Y4UbpfDnq6NBxXXRr3azNUahCoYIVvTTNcfFiWXvhW2Ie
Yw3v1dfH4pxdeZodBInaikJ1o2IAYWXQVRuX06ywcItFIcH9aUuvP8g0DEEe3xwf
iIV3IJ+rUzEHLh/r+9CabSotT5TqwvYPLWnhBUD3YaD56VXGlipdZ7bQiH80CUXw
WvmDH84qEJ+D7btxFBYl+OP7irl3cdcQNmYYJOQWyMOK0h+AhSEBx7qpDOC/Ew1b
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----

1.3、配置 SSL协议和加密方式

 ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers     HIGH:!aNULL:!MD5;

二、配置http2的操作:

2.1、在443 监听端口时,配置 http2 标签。

listen 443 http2 ssl; 

2.2、提高加密的方式:【http 2 需要安全度高的加密方式】

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

三、具体配置文件:

server {
  #  listen       80;
     listen [::]:443 ssl http2 ipv6only=on;
     listen  443 http2  ssl;

    server_name  www.huaijiujia.com;
    ssl_certificate     https_cert/huaijiujia_ca_chained.crt;
    ssl_certificate_key https_cert/huaijiujia_private.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  #  ssl_ciphers         HIGH:!aNULL:!MD5;
  ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    root   /var/www/www.huaijiujia.com;  #wordpress local
    index index.php index.html index.htm;


    location / {

        # try_files $uri $uri/ =404;
         try_files $uri $uri/ /index.php?q=$uri&args;

    }

location ~ \.php$ {
        try_files $uri =404;
      #  fastcgi_pass   127.0.0.1:9000;
      #  fastcgi_pass unix:/var/run/php-fpm/php-fcgi.sock;
        fastcgi_pass unix:/dev/shm/php-fcgi.sock; # put into memorey ,but get error , i give up,finally get ok https://blog.linuxeye.cn/364.html
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

四、其他问题

注意nginx开启了,https后,要记得 防火墙 开 443 端口的   tcp

firewallcmd permanent addport=443/tcp
firewallcmd reload

如果是源码编译安装nginx,可能没有安装ssl模块,需要重新 编译安装。
[楼主是用yum安装,和源码安装的目录位置 可能不同 ]

1.the "ssl" parameter requires ngx_http_ssl_module  in /usr/local/nginx/conf/nginx.conf:37
原因是nginx缺少http_ssl_module模块,编译安装时带上--with-http_ssl_module配置就可以了
2.如果已经安装过nginx,想要添加模块看下面
1)切换到nginx源码包
cd /usr/local/src/nginx-1.11.3
2)查看ngixn原有的模块
/usr/local/nginx/sbin/nginx -V
3)重新配置
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
4)重新编译,不需要make  install安装。否则会覆盖
make
5)备份原有已经安装好的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
6)将刚刚编译好的nginx覆盖掉原来的nginx(ngixn必须停止)
cp ./objs/nginx /usr/local/nginx/sbin/ 
这时,会提示是否覆盖,请输入yes,直接回车默认不覆盖
7)启动nginx,查看nginx模块,发现已经添加
/usr/local/nginx/sbin/nginx -V

 

nginx配置文件-安全配置-静止ip访问服务器

1、listen 指令后面有一个参数default_server ,这个参数是在 0.8.21 版本以后才有的,而之前是default 指令。Nginx 的虚拟主机是通过HTTP请求中的Host值来找到对应的虚拟主机配置,如果找不到呢?那 Nginx 就会将请求送到指定了 default_server 的 节点来处理,如果没有指定为 default_server 的话,就跑到 localhost 的节点,如果没有 localhost 的节点,那只好 404 了。

2、server_name _;  这里指定的不是什么特别的名字,它只是一个无效的域名。从来不会匹配任何真实名字相匹配。

一、80端口访问时:

这里介绍修改配置文件nginx.conf两种方法:
1)在server段里插入如下正则:
listen       80;
server_name  www.yuyangblog.net;
if ($host != 'www.yuyangblog.net'){
   return 403;
}


2)添加一个server
新加的server(注意是新增,并不是在原有的server基础上修改)
server {
  listen 80 default;
  server_name _;
  return 403;
}

二、443端口访问时:

必须要提供 ssl证书,才能 正确执行 ip 屏蔽 操作。

server
{
    listen 443 ssl default_server;
    ssl_certificate      path_to_your_fullchain.cer;
    ssl_certificate_key  paht_to_your_key;
    return 301 https://demo.com;
    #other return way
    #return  400;  # ban ip access to https server ,return 444, 404 is also OK

}

 

nginx配置文件-流量控制-端口转发与反向代理

一、端口转发

   编辑主配置文件:/etc/nginx/nginx.conf

下面的配置是将 443 端口的所有流量,转发给 本机的 8443 端口。

stream {

upstream simple-obfs-support {
        hash $remote_addr consistent;
        server 127.0.0.1:8443;     # ip:port
    }

server {
    listen  443;
    proxy_pass simple-obfs-support;
}

}

二、反向代理

大白话:就是将一台服务器的请求转发给后面多台服务器。

upstream  backend {  #①
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend; #②
    }
}

注意有①,和②行的写法。要引用backend模块,只需把它制定成http://backend就行。

 

sbt问题-Scala sbt run – “Unsupported major.minor version 52.0”

 

当一开始安装配置好 sbt时,刚在 终端 输入 sbt 命令 ,想启动sbt时就发现报错了。

[error] (run-main-0) java.lang.UnsupportedClassVersionError: akka/event/LogSource : Unsupported major.minor version 52.0
java.lang.UnsupportedClassVersionError: akka/event/LogSource : Unsupported major.minor version 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2625)
        at java.lang.Class.getMethod0(Class.java:2866)
        at java.lang.Class.getMethod(Class.java:1676)

原因是,系统版本的jdk 与 sbt 不兼容,将系统中的 jdk 7 升级到 jdk 8 就行了。

参考:https://stackoverflow.com/questions/39197422/scala-sbt-run-unsupported-major-minor-version-52-0

sbt用法-基本命令与构建Scala项目

一、构建简单Scala项目

创建文件SimpleProject/hw.scala

object Hi{
  def main(args: Array[String]) = println("Hello world!")
}

运行

D:\MyCode\Scala\SimpleProject>sbt
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Loading global plugins from C:\Users\test\.sbt\0.13\plugins
[info] Set current project to hello (in build file:/D:/MyCode/Scala/SimpleProject/)
> run
[info] Updating {file:/D:/MyCode/Scala/SimpleProject/}root...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Compiling 1 Scala source to D:\MyCode\Scala\BuildProject\target\scala-2.10\classes...
[info] Running Hi
Hello world!
[success] Total time: 43 s, completed 2016-4-9 20:16:21

二、构建完整Scala项目

sbt项目目录与Maven项目目录类似,创建下面的目录:

├── src
│  ├── main
│  │  ├── java
│  │  ├── resources
│  │  └── scala
│  ├── test
│  │  ├── java
│  │  ├── resources
│  │  └── scala
├── build.sbt
├── project
│  ├── build.properties
│  ├── plugins.sbt

其中bulid.sbt为构建定义,project目录是你的工程内另一个工程的项目,它知道如何构建你的工程,即project项目为元构建,相关文档为http://www.scala-sbt.org/0.13/docs/zh-cn/Organizing-Build.html

简单的bulid.sbt文件

name := "hello"      // 项目名称

organization := "xxx.xxx.xxx"  // 组织名称

version := "0.0.1"  // 版本号

scalaVersion := "2.10.6"   // 使用的Scala版本号

// 添加项目依赖
libraryDependencies += "ch.qos.logback" % "logback-core" % "1.0.0"

libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.0.0"

// 或者

libraryDependencies ++= Seq(
                            "ch.qos.logback" % "logback-core" % "1.0.0",
                            "ch.qos.logback" % "logback-classic" % "1.0.0",
                            ...
                            )

// 添加测试代码编译或者运行期间使用的依赖
libraryDependencies ++= Seq("org.scalatest" %% "scalatest" % "1.8" % "test")

创建项目目录并添加配置文件完成后,生成eclipse项目:在项目基目录下运行下列命令

sbt eclipse

通过上面的命令能够生成eclipse目录,使用eclipse导入项目,即可开始开发。

三、sbt的交互模式

在项目目录下运行sbt命令进行交互模式

# 在交互模式中能够运行常见的命令,例如,进行compile:
>  compile

其它常见命令:

clean 删除所有生成的文件 (在 target 目录下)。
compile 编译源文件(在 src/main/scalasrc/main/java 目录下)。
test 编译和运行所有测试。
console 进入到一个包含所有编译的文件和所有依赖的 classpath 的 Scala 解析器。输入 :quit, Ctrl+D (Unix),或者 Ctrl+Z (Windows) 返回到 sbt。
run <参数>* 在和 sbt 所处的同一个虚拟机上执行项目的 main class。
package src/main/resources 下的文件和 src/main/scala 以及 src/main/java 中编译出来的 class 文件打包成一个 jar 文件。
help <命令> 显示指定的命令的详细帮助信息。如果没有指定命令,会显示所有命令的简介。
reload 重新加载构建定义(build.sbtproject/*.scalaproject/*.sbt 这些文件中定义的内容)。在修改了构建定义文件之后需要重新加载。

参考:https://www.cnblogs.com/codingexperience/p/5372617.html

sbt概述与安装配置

一、sbt简介

sbt是类似ANT、MAVEN的构建工具,全称为Simple build tool,是Scala事实上的标准构建工具。

主要特性:

  1. 原生支持编译Scala代码和与诸多Scala测试框架进行交互;
  2. 使用Scala编写的DSL(领域特定语言)构建描述
  3. 使用Ivy作为库管理工具
  4. 持续编译、测试和部署
  5. 整合scala解释器快速迭代和调试
  6. 支持Java与Scala混合的项目

二、sbt下载安装

下载地址:官网  ,安装方法:

### mac平台 直接安装 ,自动设置了环境变量
$ brew install sbt@1
### 安装过程如下
cooldeMacBook-Pro:~ cool$ brew install sbt@1
==> Downloading https://github.com/sbt/sbt/releases/download/v1.2.6/sbt-1.2.6.tgz
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/27955

curl: (28) Connection timed out after 5004 milliseconds
Trying a mirror...
==> Downloading https://sbt-downloads.cdnedge.bluemix.net/releases/v1.2.6/sbt-1.2.6.tgz
######################################################################## 100.0%
==> Caveats
You can use $SBT_OPTS to pass additional JVM options to sbt.
Project specific options should be placed in .sbtopts in the root of your project.
Global settings should be placed in /usr/local/etc/sbtopts
==> Summary
🍺  /usr/local/Cellar/sbt/1.2.6: 521 files, 49.8MB, built in 51 seconds
cooldeMacBook-Pro:~ cool$ 


# =============================
## 非 mac 平台,下载后解压到自己定义的文件夹,然后将解压目录的bin目录加入PATH环境

# Linux环境,使用`sudo vim /etc/profile`打开配置文件,添加下面的命令
export SBT_HOME=/opt/sbt
export path=path:$SBT_HOME/bin

# Windows 平台 打开高级系统设置,
# 在环境变量中添加系统变量
# SBT_HOME  =>   D:\sbt
# 并加入path路径,
# path=> path;%SBT_HOME%\bin

检验是否安装成功:使用sbt命令,该命令会执行一段时间,下载jar包,加载插件,最后查看是否进行交互界面,如下所示:

skydeMacBook-Pro:~ sky$ sbt
[info] Updated file /Users/cool/project/build.properties: set sbt.version to 1.2.6
[info] Loading settings for project global-plugins from idea.sbt ...
[info] Loading global plugins from /Users/cool/.sbt/1.0/plugins
[info] Updating ProjectRef(uri("file:/Users/cool/.sbt/1.0/plugins/"), "global-plugins")...
[info] Done updating.
[info] Loading project definition from /Users/cool/project
[info] Updating ProjectRef(uri("file:/Users/cool/project/"), "cool-build")...
[info] Done updating.
[info] Set current project to cool (in build file:/Users/cool/)
[info] sbt server started at local:///Users/cool/.sbt/1.0/server/a50398cff041de74d7d0/sock
sbt:cool> 

三、sbt简单配置

配置ivy目录:
可以对sbt进行配置,能够配置ivy的文件目录,ivy是sbt的默认管理项目依赖工具,它默认是在user home下建立library repository【我看到的默认目录变成了用户根目下面的–> .ivy2 】,但用户可以配置ivy的library local repository。

修改sbt配置文件: [sbt安装目录]/conf/sbtconfig.txt,在配置文件中添加一行

-Dsbt.ivy.home=[你自己挑选的目录]/repository

 配置镜像库:
感觉sbt运行时会从maven官网下载大量的jar包,可能会非常缓慢,可以添加国内的maven库,从而能够加快运行速度,在”~/.sbt”下创建repositories文件,添加下面的内容:

[repositories]
local                         # 本地ivy库
maven-local: file://~/.m2/repository       # 本地Maven库 
osc: http://maven.aliyun.com/nexus/content/groups/public/    #阿里云的maven库,用于加快速度
typesafe: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
sonatype-oss-releases
maven-central
sonatype-oss-snapshots

配置插件:
sbt有自己的插件,这里介绍能够生成eclipse目录的插件:sbteclipse插件https://github.com/typesafehub/sbteclipse。

添加sbteclipse插件可以通过两种方式添加:

配置全局文件:~/.sbt/0.13/plugins/plugins.sbt
配置项目文件: PROJECT_DIR/project/plugins.sbt

# 只要在其中一个文件添加 下面的一行 就行了
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
# 安装sbteclipse插件后可以在sbt交互界面使用`eclipse`命令生成eclipse项目

 

参考:

https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Mac.html

https://www.cnblogs.com/codingexperience/p/5372617.html