项目部署上线时需要打包,我们的项目是采用maven工程,打包时碰到过两个问题,做下记录:
1.Maven如何打入本地jar包
使用支付宝API时发现有些jar没有在中央仓库中,只能从支付宝下载jar,然后引入到项目中,这种情况下再使用平时的打包方式存在问题,需要做如下处理:
- 我在与src并列的目录下新建一个lib的文件夹,将支付宝的alipay-sdk-java-ALL20171128134549.jar包放在这个文件夹里面。
- pom的依赖中这样写:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>ALL20171128134549</version>
<scope>system</scope>
<systemPath>${basedir}/lib/alipay-sdk-java-ALL20171128134549.jar</systemPath>
</dependency>
- pom的引入插件中这样写:
<plugins>
<!--打包war,引入lib下的jar-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warName>${project.artifactId}</warName>
<webResources>
<resource>
<directory>lib/</directory>
<targetPath>WEB-INF/lib</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
这样就可以在部署时将本地jar包打入war包中了。
2.使用maven的profiles动态选择配置文件
日常开发中通常会有开发环境和生产环境,配置文件一般都是在xxx.properties中配置着,如果变动比较少还尚可采用注释掉不用的配置,放开需要的配置,但是如果生产和开发好多配置文件都不一样,每次打包之前都要不停的改动,不紧浪费时间,而且顾此失彼容易出错,maven的profiles可以解决这个问题,我们只需要勾选需要的环境,就可以动态的打包出不同的配置了。如下图:
- pom.xml中的配置
<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>ALL20171128134549</version>
<scope>system</scope>
<systemPath>${basedir}/lib/alipay-sdk-java-ALL20171128134549.jar</systemPath>
</dependency>
</dependencies>
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
<build>
<finalName>scm</finalName>
<filters>
<filter>src/main/resources/profiles/${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<!--打包war,引入lib下的jar-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warName>${project.artifactId}</warName>
<webResources>
<resource>
<directory>lib/</directory>
<targetPath>WEB-INF/lib</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
<path>/</path>
<!-- <url>http://192.168.25.138:8080/manager/text</url> <username>tomcat</username>
<password>tomcat</password> -->
</configuration>
</plugin>
</plugins>
</build>
- dev.properties的配置
profile.env=dev
#支付宝网关
alipay.gateway = https://openapi.alipaydev.com/gateway.do
#支付宝appid
alipay.app.id = appid
#私钥
alipay.private.key = 私钥
#公钥
alipay.public.key =公钥
#支付宝授权登录页
alipay.url = https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm
#支付宝授权成功之后的回调地址
redirect.url = 回调地址
#我们自己网站的域名,用于重定向至错误页面
web.site = www.baidu.com
- prod.properties的配置
profile.env=prod
#支付宝网关
alipay.gateway = https://openapi.alipaydev.com/gateway.do
#支付宝appid
alipay.app.id = appid
#私钥
alipay.private.key = 私钥
#公钥
alipay.public.key =公钥
#支付宝授权登录页
alipay.url = https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm
#支付宝授权成功之后的回调地址
redirect.url = 回调地址
#我们自己网站的域名,用于重定向至错误页面
web.site = www.baidu.com
通过profile.env指定不同的环境
- sys-config.properties核心文件的配置(看你spring中引入的是哪个配置文件了)
env=${profile.env}
alipay.gateway=${alipay.gateway}
alipay.app.id=${alipay.app.id}
alipay.private.key=${alipay.private.key}
alipay.public.key=${alipay.public.key}
alipay.url=${alipay.url}
redirect.url=${redirect.url}
web.site=${web.site}
#endpoint = http://oss-cn-qingdao.aliyuncs.com
如果没有特别的需要是不用再这里在写alipay.gateway=${alipay.gateway},我这里因为java类中用到了读配置文件的value值来生成实例,我就让java类来读这个sys-config.properties,而不去读dev.properties,所以这里用占位符的方式指定不确定的值。
- 打包时如果用的是idea(eclipse我没试)直接在右上角的位置选定你需要的环境打就可以了,比较方便。
3.补充之前知识:
我之前写过一篇【spring.xm中配置文件使用占位符】,再次贴出来,可以结合着一块来看,全文如下:
在spring中,可以使用PropertyPlaceholderConfigurer引入properties的配置文件,在配置文件中定义key,value形式的键值对,之后在xml中读取${key}的值,可以灵活的配置常用参数。
1.定义.properties的配置文件
这里用一个mysql数据库连接的配置文件做测试。
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://192.168.49.127\:3306/test?useUnicode\=true&characterEncoding\=UTF-8&useSSL=true
jdbc.username=root
jdbc.password=root
2.在.xml中引入.properties配置文件
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:jdbc.properties</value>
<value>/WEB-INF/mail.properties</value>
</list>
</property>
</bean>
注意上面一种classpath是引用src目录下的文件写法,下面一种是引入在WEB-INF下面的文件。
如果引入单个文件,还可以不用list。
<bean id="propertyConfigurerForProject1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="location">
<value>classpath:/com/catchu/me/jdbc.properties</value>
</property>
</bean>
3.使用配置文件
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
使用时直接使用${}就可以了,类似于EL表达式。