您的位置:首页 > 其它

Maven项目打包遇到的两个问题

2017-12-07 17:40 423 查看
项目部署上线时需要打包,我们的项目是采用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[/code] 
如果没有特别的需要是不用再这里在写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表达式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  maven profile