maven实践–你所要了解之maven

Boss说,我们请了只大证书,不如做均站式的https吧,让用户打开主页就会观看被信赖的绿标。于是我们尽管起来了填坑的一起。

基本概念

【只达到主域好不好?】

是什么?

Maven是一个强的Java项目构建工具。

哎呀是构建工具?

构建工具是拿软件项目构建相关的长河自动化的家伙。构建一个软件项目一般含以下一个或者多只经过:

  1. 别源码(如果项目下自动生成源码);
  2. 自打源码生成项目文档;
  3. 编译源码;
  4. 运作单元测试
  5. 用编译后底代码打包成JAR文件或者ZIP文件;
  6. 将从今包好之代码安装到服务器、仓库或者其它的地方;
  7. 叙项目内的依赖关系

微种类或需要再行多之历程才会得构建,这些过程相似为可以结合至构建工具中,因此它们也足以实现自动化。

自动化构建过程的补益是将手动构建过程遭到犯错的高风险降到低。而且,自动构建工具通常如比较手动执行同一的构建过程要趁早。

糟糕。。。console会报生同样那个堆warning因为图片域没有https~浏览器证书符号为非是绿色的~

着力概念:POM文件(POM project object mode项目对象模型)

POM文件是盖XML文件的样式表达项目的资源,如源码、测试代码、依赖(用到的外部Jar包)等。

pom主要有:
葡京网上娱乐场 1

 

简单易行运行

当您安装好了Maven,并且于路的彻底目录下创造了POM文件,可以于类型达到运行Maven了。

mvn clean install

该命令首先执行clean构建周期,删除Maven输出目录中已编译的类文件,然后执行install构建阶段。

【在乌解密SSL?】

maven深入实行

大网站都是架设复杂的啦~各层负载均衡和景象分离~其中最经典的哪怕是图形与利用分离,这为招致了咱们要让点儿独域配证书。

构建生命周期

  • 构建生命周期介绍

Maven中置放了三独构建生命周期:default,clean和site。default生命周期处理工程的布置,clean生命周期处理工程的清理,而site生命周期则承担创建工程的站点文档。

怀念了当NginX配,好处是在同等宝机上只配一个证件,坏处是大抵独机器的布置难以管理,所以只好在面前HA层配~

packaging直接影响Maven的构建生命周期。

于Maven 3中,其可用的从包类型如下:

  1. jar,默认类型
  2. war
  3. ejb
  4. ear
  5. rar
  6. par
  7. pom
  8. maven-plugin

假使想同一次从包多独品种,可下聚合类型pom,它便由一个父模块和几何个头模块组合。

<packaging>pom</packaging>

<modules>
    <module>zy-service-consumer</module>
    <module>zy-eureka-server</module>
    <module>zy-zipkin-service</module>
    <module>zy-hystrix-dashboard</module>
</modules>

切切实实怎么配网上许多科目啦~大概就是是布局指向一个文件文件,里面是域名与证书的列表。

构建生命周期是出于阶段做的

其三个构建生命周期都是出于同多级不同的构建等做,每一个构建等代表了生命周期的一个等。

盖default生命周期为例,它是由于以下的流做

  • validate – 验证该品种是否是,所有必要之信息都是可用之
  • compile – 编译工程源码
  • test –
    使用一个相宜的单元测试框架测试编译的源代码。这些测试的代码不见面吃起包要部署到品种蒙
  • package – 将编译的代码打包改成其揭示之格式,例如JAR
  • integration-test –
    如果必要的话,该命令会将工程处理并安排在一个并测试运行的条件中
  • verify – 运行任何检查为验证该包是否中,是否切合质量标准
  • install – 将工程打包安装至地头仓库着,以便地面其他种类得以开展依赖
  • deploy –
    在拼或发表环境遭到,将最终工程打包复制到长途仓库被,用于与其他开发人员和花色共享

mvn deploy
它不仅执行指定的构建阶段,而且会执行指定构建阶段之前的每一个阶段。因此,执行

 

构建等采用的构建插件

mvn install


[INFO] ------------------------------------------------------------------------
[INFO] Building zy-zeromq 1.0.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ zy-zeromq ---

(查看完的生命周期阶段列表,请参见生命周期参考)

【测试环境怎么收拾?】

仓库

仓库就分为两类似:本地仓库和长途仓库。

当Maven根据坐标寻找构建的时,首先会见翻本地仓库,如果地方仓库在是部件,则直动用;如果地方仓库不设有这个部件,或者需要查阅是否出更新的预制构件版本,Maven就会及长途仓库寻,发现需要的构件后,将该下充斥至地头仓库再使用。如果当地仓库和远程仓库都非在用的构件,则报错。

葡京网上娱乐场 2

凉拌呗~用openssl生成几单自签证书就了了~然后自己手动导入到浏览器就是可以高兴玩耍了~

私服

私服的利益:节约外网的带来富,加速Maven的构建,方便部署第三正在构件,稳定等

葡京网上娱乐场 3

大体会是这样
http://www.centoscn.com/CentOS/config/2014/0220/2423.html

配置及长途仓库

拿仍项目jar包上盛传私服、远程仓库,供项目组或者其他人用。配置如下:

pom.xml
<distributionManagement>
    <repository>
        <id>thirdparty</id>
        <name>3rd party</name>
        <url>http://192.168.100.103:8081/nexus/content/repositories/thirdparty/</url>
    </repository>
</distributionManagement>

settigns.xml配置认证
<servers>
    <server>
        <id>thirdparty</id>
        <username>repo-user</username>
        <password>repo-psw</password>
    </server>
</servers>


mvn命令:
本地仓库 的更新
mvn  clean package install 
远程 仓库 的更新
mvn clean package deploy

如果编译出问题时,可以执行如下命令
mvn clean install -e -U
-e详细异常,-U强制更新 

以加速下载,可以配备部分镜像mirror。

发出几乎个中心:

依赖

1.刚初始之私钥是有密码保护的,但是在服务器受到貌似是直接用的,所以要是拿该私钥转换成为无密码保护的。

仰传递性

  1. 子项目可以持续父亲项目的依赖
  2. 型A依赖型B,项目A–>项目B,项目B中之依赖性也会于投入到花色A中。

鉴于因的传递性,导致项目面临设有多只同名的jar包,存在jar包冲突等。maven提供的以下机制来化解这些问题:

2.pem文件等:crt证书+私钥,密码体系pem、X509之类的各种国际标准就未进行了,总之就是是几机关信息、密钥、摘要等。

仰调解法

过从Maven
2.0.9开始,POM中凭借声明的一一决定了谁版本会给使用,也吃作”第一声明原则”。

3.纪念偷懒的可签给*.主域.com,但如此就是没法提前于测试环境踩坑填坑了,多证件之气象到底是差之。

靠管理

每当差不多模块应用中,可能大多单子项目会产生同之依赖性。

以顶层的pom中指定依赖项的版本,以便为具有的子项目使用同样版本。dependency
management只是乘之一个声明,子路用显式引用,但不用指定版本号。

父项目pom
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>


子项目pom,需显式引用依赖,但不用指定版本号。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

4.密钥和证明的400权力设置,非生产条件而自由~

凭借范围

  • compile 默认的scope,表示 dependency
    都可以当生命周期中行使。而且,这些dependencies
    会传递及因之类别蒙。适用于所有阶段,会趁着项目并发布
  • provided 跟compile相似,但是表明了dependency
    由JDK或者容器提供,例如Servlet AP和组成部分Java EE APIs。这个scope
    只能作用在编译和测试时,同时没有传递性。

    <dependency>
    <groupId>org.apache.storm</groupId>
    <artifactId>storm-core</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
    </dependency>
    
  • runtime
    表示dependency不打算在编译时,但会打算在运作及测试时,如JDBC驱动,适用运行与测试阶段。

  • system 跟provided
    相似,但是在系统受假如因表JAR包的款式提供,maven不见面当repository查找它。
  • import(Maven2.0.9及以上)
    import范围才适用于pom文件被的
  • test
    范围表明以此依赖范围之赖,只以编译测试代码和运转测试的时候需要,应用之正常化运行不欲此类依赖。

 

凭排除

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 稍微技巧:一般在编译时类找不交,但是事实上是jar冲突情况常常。在idea中安装Maven
    Helper插件,根据jar名称搜索,定位及具体的仗,在因中消除冲突jar包。

【HSTS好不好?】

可选依赖

但选取的负工作规律

Project-A -> Project-B
点的图表示项目A依赖让路B,当A在它的POM文件被管B声明也一个可选的依赖性,他们的关系还没改变。仅仅就是比如相同破正常的构建,在这次构建中,项目B将会见于填补加进classpath。

Project-X -> Project-A
而是当一个其它的花色(项目X)在她的POM文件被宣称项目A为一个依,这个可选的赖就发挥作用了。你以见面注意到项目X的classpath不会见含有项目B:为了拿B包含进项目X的classpath,你要以你的POM文件中直接声明。

例子:

发生一个称为也X2的品种,这个项目及hibernate有一些像样之成效,支持广大数据库让/依赖,比如说MySQL,postgre,oracle等。为了构建X2,所有的这些靠还是要的,但是对于你的路以来也未是必的,所以对X2把这些靠声明也而挑选的凡特别实用的,不论什么时候当您以POM文件中管X2声明也一个直依赖的时段,所有为X2支持之使不见面活动的让含有进你的项目之classpath,你用直接声明你就要采用的数据库的负/驱动。

当好,全站式https就该被HSTS严格传输安全,直接以浏览器就帮你管http转为https请求,而休用301返跳转。

起定义打包maven-assembly-plugin

于运转mapreduce/storm时,一般是以jar包方式运行,每个jar包中凭借之jar的保管,可以使用maven-assembly-plugin。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>assembly.xml</descriptor>
                </descriptors>
                <finalName>${project.artifactId}-${project.version}</finalName>
                <attach>false</attach>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase><!-- 绑定到package生命周期阶段上 -->    
                    <goals>
                        <goal>single</goal><!-- 只运行一次 --> 
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

assembly.xml

<!--是否生成和项目名相同的根目录-->
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
    <fileSet>
        <directory>${project.basedir}/target/classes</directory>
        <outputDirectory>.</outputDirectory>
    </fileSet>
    <!--<fileSet>
        <directory>${project.basedir}/src/main/resources</directory>
        <outputDirectory>./</outputDirectory>
    </fileSet>-->
</fileSets>
<dependencySets>
    <dependencySet>
        <!--是否把本项目添加到依赖文件夹下-->
        <useProjectArtifact>false</useProjectArtifact>
        <outputDirectory>/lib</outputDirectory>
        <!--<excludes>
            <exclude>org.apache.storm:storm-core</exclude>
        </excludes>-->
    </dependencySet>
</dependencySets>

其他大配置方式

<configuration>
    <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    ...
</configuration>
这种方式打出的包是fat jar,也就是把依赖的jar包全部解压成class文件后,再与自己的代码打成一个jar包。

但一旦生各自页面确实还并未达标https,那就是从不办法了~

maven assembly

 

命令

  1. mvn clean 清除目标目录中之浮动结果
  2. mvn package 依据项目变更 jar 文件,打包之前会展开编译,测试
  3. mvn install在本地 Repository 中安装 jar

跳过测试类 : -Dmaven.test.skip=true
下载jar包源码: -DdownloadSource=true
下载javadocs: -DdownloadJavadocs=true

【烂鬼证书商,在大哥大浏览器打不上马?】

Archrtype

原型(Archetype)是一个Maven工程模板工具包。

maven-archetype-quickstart用得比多。

怎可能啊,证书供应商是权威机构,怎么会于安卓里没有彻底证书啊?一般排查之后察觉,安卓里确实是产生证书商的根本证书的。再几海查资料后才发觉,要部署ca-bundle证书链,也就是吃信赖的绝望证书层层签下的之依靠关系~手机浏览器为能够快玩耍了~

maven vs gradle

  • maven和gradle的比和使用
    总的看,gradle相比叫maven有深打之油滑,目前gradle的使用者更多。而由于maven之前处于主流,并且在一些地方maven较gradle还有一部分独到之处,所以maven和gradle并存。在github上绝大多数理想之开源项目及其时提供maven和gradle两种植丰富依赖之法子。

 

参考文献

  • Maven入门指南(一)
  • Maven学习(三) —
    仓库
  • Maven依赖体制简介

tips:本文属于自己学和实践过程的记录,很多图跟仿都粘贴自网上文章,没有注明引用请见谅!如产生外问题要留言或邮件通知,我会马上回复。

【你的https安全性如何?】

推个百度的板栗(也非知晓ip对怪,不是a.shifen.com那个~)

https://www.ssllabs.com/ssltest/analyze.html?d=baidu.com&s=103.235.46.39

咱们网站就接近这样。。。神马贵宾犬漏洞啊心脏流血漏洞啊全都露出来了~读了一百般堆英文警告,说啊会叫中间人抨击利用等等之类的,最后实际就是一律句话。。。要升迁openssl版本,要增长TSL版本。。。

足望这篇稿子 http://www.oschina.net/news/56159/ssl-v3-poodle

 

【要无苟为此SNI?】

购进CDN服务之时段说服务商问要无苟非SNI支持啊?SNI是啊呢?Server Name
Indication是TSL协议的扩充,用于支持一个IP绑定多只证。所以非SNI,就是IE7等老本子浏览器的兼容问题。。。请用现代浏览器。。。

 

【客户端报错peer not authenticated】

浏览器、手机及一般客户端访问似乎是绝非问题的,然而天杀的某部外部系统衔接调用就起问题了。。。网上还算得没装证书,然而我们是高于证书啊怎么会~

下一场我写了只简易的httpclient调用,在劳务器端启动调用的归来是常规的,在IDE中启动调用就报SSL这个荒唐。

几乎胡排查确认,在jdk1.7蒙运行如常,在jdk1.6蒙报错,这里用底httpclient葡京网上娱乐场是4.1。

接下来简单单多疑,一个是httpclient或jdk中是否来啊bug,另一个凡原始版jdk是否就此了最为老的SSL协议如果服务端不允许。

以此题目还有待验证和有待解决。欢迎大牛提建议。

 

从那之后,近似全站https就走起了~好多定义和操作细节就不一一展开了。

末尾奉上阮大神对SSL/TSL的规律分析,篇幅不增长,但是精要地讲了https握手及通信的进程。

http://www.ruanyifeng.com/blog/2014/02/ssl\_tls.html