项目部署上线时需要打包,我们的项目是采用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可以解决这个问题,我们只需要勾选需要的环境,就可以动态的打包出不同的配置了。如下图:

maven打包 控制台乱码 maven打包问题_配置文件


- 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表达式。