==============================================================================
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>