==============================================================================
maven 多环境打包配置
pom.xml文件配置:

<build>
        <finalName>cacheCloud-clientTest</finalName>
        <resources>
        <resource>
            <directory>${profile.dir}</directory><!--下面profiles/profile/properties的【profile.dir】值-->
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
        </resources>
</build>
<profiles>
    <profile>
        <id>dev</id><!-- mvn package -Pdev -->
        <properties>
            <profile.dir>src/main/profiles/dev</profile.dir>
        </properties>
    </profile>
    <profile>
        <id>product</id>
        <properties>
            <profile.dir>src/main/profiles/product</profile.dir>
        </properties>            
    </profile>
</profiles>

src/main目录下新建文件夹profiles,profiles文件夹里新建两个文件夹dev、product,


dev、product里面存放相应的.properties文件例如db.properties


*********************************************************************


filters配置及applicationContext.xml中读取properties文件值
1.<util:properties />


pom.xml中配置: 

 <resources> 

     <resource> 

         <directory>${profile.dir}</directory> 

     </resource> 

         <resource> 

                 <directory>src/main/resources</directory> 

         </resource> 

 </resources> 

 applicationContext.xml中配置: 

 <util:properties id="dbproperties" location="classpath:db.properties"/> 

 <property name="username" value="#{dbproperties['db.username']}"/> 


 ${db.username}读取不到,需用#{dbproperties['db.username']}这种方式 

 ********************************************************************* 

2.<context:property-placeholder /> 

 pom.xml中配置: 

 <resources> 

     <resource> 

         <directory>${profile.dir}</directory> 

     </resource> 

         <resource> 

                 <directory>src/main/resources</directory> 

         </resource> 

 </resources> 

 applicationContext.xml中配置: 

 <context:property-placeholder location="classpath:db.properties"/> 

 用${db.username}读取


*********************************************************************


3.<filters>


pom.xml中配置:



<resources>     

     <resource> 

         <directory>src/main/resources</directory> 

         <filtering>true</filtering> 

     </resource> 

 </resources> 

 <filters> 

     <filter>${profile.dir}/db.properties</filter> 

     <filter>${profile.dir}/cache.properties</filter> 

 </filters>

applicationContext.xml中配置:


直接用${db.username}读取,不用<util:properties />、<context:property-placeholder />引入.properties文件


==============================================================================


maven仓库



<<maven实战>>



1.中央仓库的url位置在如下目录中:


${MAVEAN_HOME}\lib\maven-model-builder.jar\org\apache\maven\mode\pom.xml中, 


 <repositories> 

     <repository> 

       <id>central</id> 

       <name>Central Repository</name> 

       <url>https://repo.maven.apache.org/maven2</url> 

       <layout>default</layout> 

       <snapshots> 

         <enabled>false</enabled> 

       </snapshots> 

     </repository> 

   </repositories>



2.默认插件


TODO



3.配置远程仓库



pom.xml中配置:


<repositories>
        <repository>
            <id>jboss</id>
            <name>JBoss Repository</name>
            <url>http://repository.jboss.com/maven2/</url>
        <releases>
        <enabled>true</enabled>
        </releases>
        <snapshots>
        <enabled>false</enabled>
        </snapshots>
        </repository>
</repositories>



4.远程仓库的认证


大部分远程仓库无须认证就可以访问,但有时候出去安全方面的考虑,我们需要提供认证信息才能访问一些远程仓库。


或者,自己公司搭建的私服,不用认证可以下载jar包,但需要认证后才能deploy jar包到私服上。



配置认证信息与配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在setting.xml文件中。


这是因为POM往往是被提交到代码仓库中供所有成员访问的,而setting.xml一般只放在本机。因此,在setting.xml中配置认证信息更为安全。


<servers>
    <server>
    <id>snapshots</id>
    <username>admin</username>
    <password>admin123</password>
    </server>
    <server>
    <id>releases</id>
    <username>admin</username>
    <password>admin123</password>
   </server>
</servers>



5.部署至远程仓库


私服的一大作用就是部署第三方构件,包括组织内部生成的构件以及一些无法从外部仓库直接获取的构件。


将这些构件部署到私服中,供其他团队成员使用。

在pom.xml文件中,配置

<distributionManagement>
        <repository>
            <id>releases</id>
            <url>http://192.168.106.106:8081/nexus/content/repositories/apiRelease</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <url>http://192.168.106.106:8081/nexus/content/repositories/apiSnapshots</url>
        </snapshotRepository>
</distributionManagement>



往远程仓库部署构件的时候,往往需要认证(《远程仓库的认证》一节),


<distributionManagement>/<repository>/<id>与</servers></server>/<id>一致




6.mirror镜像


如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。


换句话说,任何一个客户从仓库Y获取的构件,都能够从它的镜像中获取。举个例子,


http://maven.net.cn/content/groups/public是中央仓库http://repo1.maven.org/maven2/ 在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。


因此,可以配置Maven使用该镜像来替代中央仓库。


</mirrors>
   <mirror>
    <id>maven.net.cn</id>
    <name>one of the central mirrors in China</name>
    <mirrorOf>central</mirrorOf>
    <url>http://maven.net.cn/content/groups/public</url>
   </mirror>
</mirrors>
该例中,<mirrorOf>的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,


用户也可以使用同样的方法配置其他仓库的镜像。



关于镜像的一个更为常见的用法是结合私服。由于私服可以代理任何外部的公共仓库(包括中央仓库),因此,对于组织内部的Maven用户来说,


使用一个私服地址就等于使用了所有需要的外部仓库,这就可以将配置集中到私服,从而简化Maven本身的配置。在这种情况下,任何需要的构件


都可以从私服获得,私服就是所有仓库的镜像。这时,可以配置这样的一个镜像:



<!--配置私服镜像--> 

 <mirrors> 

     <mirror>   

         <id>nexus</id>   

         <name>internal nexus repository</name>   

         <url>http://183.238.2.182:8081/nexus/content/groups/public/</url>   

         <mirrorOf>*</mirrorOf>   

     </mirror>   

 </mirrors>

该例中<mirrorOf>的值为星号,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会被转至http://183.238.2.182:8081/nexus/content/groups/public/。


如果该镜像仓库需要认证,则配置一个id为nexus的认证信息即可。



Nexus maven私服

1.配置maven从私服下载构件


当需要为项目添加Nexus私服上的public仓库时,可以按如下配置:


<project>
......
      <repositories>
        <repository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
            <releases><enabled>true</enabled></releases>
            <snapshots><enabled>true</enabled></snapshots>  
        </repository>        
      </repositories>
      <pluginRepositories>
        <pluginRepository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
            <releases><enabled>true</enabled></releases>
            <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>        
       </pluginRepositories>
</project>
这样的配置只对当前Maven项目有效,在实际应用中,我们往往想要通过一次配置就能让本机所有的Maven项目都使用自己的私服。


这个时候读者可能会想到setting.xml文件,该文件中的配置对所有本机Maven项目有效,但是setting.xml并不支持直接配置repositorys


和pluginRepositories。所幸Maven还提供了Profile机制,能让用户将仓库配置放到setting.xml中的Profile中,


<settings>
......
<profiles>
    <profile>
      <id>nexus</id>
      <repositories>
        <repository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
            <releases><enabled>true</enabled></releases>
            <snapshots><enabled>true</enabled></snapshots>  
        </repository>        
      </repositories>
      <pluginRepositories>
        <pluginRepository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
            <releases><enabled>true</enabled></releases>
            <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>        
       </pluginRepositories>
    </profile>
  </profiles>
<activeProfiles>
    <activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
以上配置会不时的访问中央仓库,我们希望所有的Maven下载请求都仅仅通过Nexus,以全面发挥私服的作用,


这个时候就需要借助于Maven的镜像配置了,如下:


<settings>
<mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://localhost:8081/nexus/content/groups/public/</url>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <id>nexus</id>
      <repositories>
        <repository>
            <id>central</id>
            <url>http://central</url>
            <releases><enabled>true</enabled></releases>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>        
      </repositories>
      <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <url>http://central</url>
            <releases><enabled>true</enabled></releases>     
            <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>        
       </pluginRepositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>central</activeProfile>
  </activeProfiles>
</settings>
这里需要解释的是仓库和插件仓库配置,它们的id都为central,也就是说,覆盖了超级POM中央仓库的配置,它们的url已无关紧要。


因为所有的请求都会通过镜像访问私服地址。配置仓库和插件仓库的主要目的是开启对快照版本下载的支持,当Maven需要下载发布版


或快照版构件的时候,它首先检查central,看该类型的构件是否支持,得到正面的回答后,再根据镜像规则转而访问私服仓库地址。




整理的setting.xml和pom.xml文件



<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    
  <localRepository>E:\repository</localRepository>

  <pluginGroups>
  </pluginGroups>
  <proxies></proxies>
  <servers>
      <server>
        <id>releases</id>
        <username>taiyang</username>
        <password>123456</password>
      </server>
      <server>
        <id>snapshots</id>
        <username>taiyang</username>
        <password>123456</password>
      </server>
  </servers>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <name>central-mirror</name>
      <url>http://私服ip:8081/nexus/content/groups/public</url>
    </mirror>
  </mirrors>

  <profiles>
    <profile>
      <id>central</id>
      <repositories>
        <repository>
            <id>central</id>
            <name>local private central</name>
            <url>http://central</url>
            <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
        <checksumPolicy>warn</checksumPolicy>
        </releases>
            <snapshots>
            <enabled>true</enabled>
        </snapshots>
        </repository>        
      </repositories>
      <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>local private central</name>
            <url>http://central</url>
            <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
        <checksumPolicy>warn</checksumPolicy>
        </releases>
            <snapshots>
        <enabled>true</enabled>
        </snapshots>
        </pluginRepository>        
       </pluginRepositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>central</activeProfile>
  </activeProfiles>
</settings>


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>包路径</groupId>
    <version>1.0</version>
    <artifactId>项目名</artifactId>
    
    <packaging>war</packaging>

    <properties>
        <java-version>1.7</java-version>
        <org.springframework-version>3.2.3.RELEASE</org.springframework-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
    ......
    </dependencies>
    
    <build>
        <finalName>打包后的项目名</finalName>
        <plugins>
            <plugin><!--默认的maven-compiler-plugin插件java-version比较低,覆盖掉默认的-->
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java-version}</source>
                <target>${java-version}</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
            <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.2.3.v20140905</version>
        </plugin>
        </plugins>
        <resources>
        <resource>
            <directory>${profile.dir}</directory>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
        </resources>
    </build>
    <profiles>
        <profile>
            <id>dev</id>
            <properties><!--上文多环境打包-->
                <profile.dir>src/main/profiles/dev</profile.dir>
            </properties>
        </profile>
        <profile>
            <id>product</id>
            <properties>
                <profile.dir>src/main/profiles/product</profile.dir>
            </properties>            
        </profile>
    </profiles>
    
    <distributionManagement>
        <repository>
            <id>releases</id>
            <url>http://私服ip:8081/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <url>http://私服ip:8081/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
    
</project>