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

项目部署上线时需要打包,我们的项目是采用maven工程,打包时碰到过两个问题,做下记录:

1.Maven如何打入本地jar包

使用支付宝API时发现有些jar没有在中央仓库中,只能从支付宝下载jar,然后引入到项目中,这种情况下再使用平时的打包方式存在问题,需要做如下处理:

  • 我在与src并列的目录下新建一个lib的文件夹,将支付宝的alipay-sdk-java-ALL20171128134549.jar包放在这个文件夹里面。
  • pom的依赖中这样写:

    1
    2
    3
    4
    5
    6
    7
        <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的引入插件中这样写:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <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中的配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    <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的配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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的配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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中引入的是哪个配置文件了)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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数据库连接的配置文件做测试。
    1
    2
    3
    4
    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配置文件

1
2
3
4
5
6
7
8
<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。

1
2
3
4
5
6
7
<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.使用配置文件

1
2
3
4
5
6
<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表达式。

刘俊重 wechat
欢迎关注我的微信公众号
坚持原创技术分享