公海赌船网址开展Maven多工程注重项目支出的上书,运用大家自定义的借助包举办多工程依赖项指标支出

  

公海赌船网址 1

公海赌船网址 2

前言

本篇小说基于Java开发小技巧(二):自定义Maven注重中创制的父工程project-monitor福寿双全,运用大家自定义的依靠包实行多工程注重项目标支出。

上边以多可进行Jar包项指标开支为例,进行Maven多工程依赖项目开销的教学。

前言

本篇小说基于Java开发小技巧(二):自定义Maven注重中开创的父工程project-monitor福寿康宁,运用大家自定义的依靠包举办多工程注重项目标费用。

上面以多可进行Jar包项指标支出为例,实行Maven多工程注重项目开发的讲课。

需求分析

第③来看一下封面图,我们要促成的成效是:
1.多少个项目共享2个项指标类和艺术等通用内容
2.各种子项目单独导入所需依赖,以及分级填充父项目布署文件中的占位符
3.子项目按内定目录结构进行打包
4.全数子项目并入打包到一个联合的目录,共享依赖包和陈设文件等情节
5.打包后目录结构:

  • bin:存放脚本文件,用来设置环境变量,执行相应的jar包
  • lib:依赖、项目jar包
  • etc:配置文件
  • ……

好啊,目的明确的,接下去要开始展览具体开发达成了

要求分析

第1来看一下封面图,大家要落到实处的机能是:
1.多个品类共享1个品类的类和章程等通用内容
2.每一种子项目单独导入所需依靠,以及个别填充父项目布局文件中的占位符
3.子项目按内定目录结构实行打包
4.全数子项目并入打包到二个统一的目录,共享依赖包和布局文件等剧情
5.打包后目录结构:

  • bin:存放脚本文件,用来安装环境变量,执行相应的jar包
  • lib:依赖、项目jar包
  • etc:配置文件
  • ……

好啊,目标一目领会的,接下去要拓展具体花费达成了

实现

实现

装进配置

在上一篇小说中早已创办好了2个自定义的Maven依赖,也就是三个父项目,接下去我们新建三个子项目,命名为project-onepom.xml文本与父项目基本相同,全体依赖包都必须独立引入,不一致的是多了对父项目标正视性:

<dependency>
    <groupId>com.demo</groupId>
    <artifactId>project-monitor</artifactId>
    <version>0.0.1</version>
</dependency>

以及Maven插件maven-assembly-plugin的引入,用来贯彻依靠的打包以及包装后的目录结构:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>
            <descriptor>package.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

目录结构布局位于项目根目录下package.xml布局文件中:

<assembly 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.0http://maven.apache.org/xsd/assembly-1.0.0.xsd">
    <id>package</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <directory>src/main/resources</directory>
            <includes>
                <include>*.properties</include>
                <include>*.xml</include>
            </includes>
            <outputDirectory>etc</outputDirectory>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

以上就兑现了花色打包的配备工作,实现流程图中最后的档次布局,打包结果为zip文件

卷入配置

在上一篇文章中曾经创办好了2个自定义的Maven依赖,相当于贰个父项目,接下去大家新建1个子项目,命名为project-onepom.xml文本与父项目基本相同,全部重视包都必须独立引入,区别的是多了对父项指标借助:

<dependency>
    <groupId>com.demo</groupId>
    <artifactId>project-monitor</artifactId>
    <version>0.0.1</version>
</dependency>

以及Maven插件maven-assembly-plugin的引入,用来兑现依靠的打包以及包装后的目录结构:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>
            <descriptor>package.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

目录结构布局位于项目根目录下package.xml布局文件中:

<assembly 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.0http://maven.apache.org/xsd/assembly-1.0.0.xsd">
    <id>package</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <directory>src/main/resources</directory>
            <includes>
                <include>*.properties</include>
                <include>*.xml</include>
            </includes>
            <outputDirectory>etc</outputDirectory>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

以上就兑现了品种打包的配备工作,实现流程图中最终的项目布局,打包结果为zip文件

填充配置文件占位符

从前大家在父项指标spring上下文中定义了三个数量源bean,配置新闻使用了占位符填充,所以只要大家想要使用那些bean,就须求替换其中的占位符消息,要如何是好呢?
首先当然是创办布局文件了,在项目中创制jdbc.propertiesJDBC配置文件,如:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localdb:3306/test?characterEncoding=utf8&useSSL=true&serverTimezone=UTC
jdbc.username=root
jdbc.password=5EF28C5A9A0CE86C2D231A526ED5B388

然后大家要求借助PropertyPlaceholderConfigurer本条类来达成,在类型spring上下文中定义bean:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:jdbc.properties</value>
    </property>
    <property name="ignoreResourceNotFound" value="false"/>
</bean>

Bingo,占位符修改完成,别忘了引入父项目的上下文,毕竟大家要填充占位符的bean是在父项目中的:

<import resource="classpath*:project-monitor.xml"/>

填充配置文件占位符

事先我们在父项指标spring上下文中定义了1个数目源bean,配置消息运用了占位符填充,所以要是大家想要使用这几个bean,就要求替换当中的占位符新闻,要怎么办吧?
率先当然是创办布局文件了,在品种中开创jdbc.propertiesJDBC配置文件,如:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localdb:3306/test?characterEncoding=utf8&useSSL=true&serverTimezone=UTC
jdbc.username=root
jdbc.password=5EF28C5A9A0CE86C2D231A526ED5B388

然后大家必要依靠PropertyPlaceholderConfigurer本条类来完毕,在类型spring上下文中定义bean:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:jdbc.properties</value>
    </property>
    <property name="ignoreResourceNotFound" value="false"/>
</bean>

Bingo,占位符修改实现,别忘了引入父项指标上下文,究竟大家要填充占位符的bean是在父项目中的:

<import resource="classpath*:project-monitor.xml"/>

测试Demo

好了,接下去来测试项指标取向,主要达成接纳父项目概念的多少源来对MySql进行查询。
先创制一个DemoService类,内容如下:

package com.demo.project.one.service;

import org.apache.log4j.Logger;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DemoService {
    private static final Logger logger = Logger.getLogger(DemoService.class);
    private DataSource dataSource;

    public void queryDb(){
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            conn = dataSource.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery("select * from movie limit 1");
            while(rs.next()){
                logger.info(String.format("Movie[Id=%d,Title=%s,Director=%s,Genre=%s,Language=%s]",
                        rs.getInt(1),
                        rs.getString(2),
                        rs.getString(3),
                        rs.getString(4),
                        rs.getString(5)
                        ));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if(rs != null){
                    rs.close();
                }
                if(stmt != null){
                    stmt.close();
                }
                if(conn != null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
}

在前后文中为其注入dataSource定义:

<bean id="demoService" class="com.demo.project.one.service.DemoService">
    <property name="dataSource" ref="dataSource"/>
</bean>

别忘了添加log4j.properties配置文件,那里就不贴出文件内容了。
OK,新建3个入口类来执行DemoService的测试呢:

package com.demo.project.one;

import com.demo.project.one.service.DemoService;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
    public static void main(String[] args){
        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("/project-one.xml");
        DemoService demoService = (DemoService)context.getBean("demoService");
        demoService.queryDb();
    }
}

末段的类型结构如图
公海赌船网址 3

测试Demo

好了,接下去来测试项指标动向,重要完成利用父项目概念的数额源来对MySql进行查询。
先创立三个DemoService类,内容如下:

package com.demo.project.one.service;

import org.apache.log4j.Logger;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DemoService {
    private static final Logger logger = Logger.getLogger(DemoService.class);
    private DataSource dataSource;

    public void queryDb(){
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            conn = dataSource.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery("select * from movie limit 1");
            while(rs.next()){
                logger.info(String.format("Movie[Id=%d,Title=%s,Director=%s,Genre=%s,Language=%s]",
                        rs.getInt(1),
                        rs.getString(2),
                        rs.getString(3),
                        rs.getString(4),
                        rs.getString(5)
                        ));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if(rs != null){
                    rs.close();
                }
                if(stmt != null){
                    stmt.close();
                }
                if(conn != null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
}

在前后文中为其注入dataSource定义:

<bean id="demoService" class="com.demo.project.one.service.DemoService">
    <property name="dataSource" ref="dataSource"/>
</bean>

别忘了添加log4j.properties布署文件,那里就不贴出文件内容了。
OK,新建三个入口类来执行DemoService的测试呢:

package com.demo.project.one;

import com.demo.project.one.service.DemoService;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
    public static void main(String[] args){
        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("/project-one.xml");
        DemoService demoService = (DemoService)context.getBean("demoService");
        demoService.queryDb();
    }
}

说到底的项目布局如图
公海赌船网址 4

打包

方方面面准备安妥,轮到项目打包了,在类型根目录执行以下Maven命令即可

mvn clean package

施行到位后您会意识target目录的构造如图所示
公海赌船网址 5
project-one.zip便是我们要的打包结果,解压后你会意识,依赖包和布署文件已经位于了各自的目录下
公海赌船网址 6

打包

凡事准备妥贴,轮到项目打包了,在品种根目录执行以下Maven命令即可

mvn clean package

执行到位后您会发现target目录的组织如图所示
公海赌船网址 7
project-one.zip就是大家要的打包结果,解压后你会发觉,依赖包和布局文件已经放在了独家的目录下
公海赌船网址 8

实施文书

花色费用实现,接下去即是进行顺序了,以Windows平台下为例,首先创立bin目录,目录中创立批处理文件setenv.batproject-one.bat
因为jar包与配置文件的离别,所以我们须求钦点执行jar包时的classpath,批处理公事内容如下:

实施文书

品类支出成功,接下去便是执行顺序了,以Windows平台下为例,首先创立bin目录,目录中成立批处理公事setenv.batproject-one.bat
因为jar包与安插文件的分离,所以大家须求钦命执行jar包时的classpath,批处理公事内容如下:

setenv.bat

@echo off
set SRC_DIR=%cd%

cd %~dp0
cd ..
set MAIN_HOME=%cd%

cd %SRC_DIR%

set BIN_HOME=%MAIN_HOME%\bin
set ETC_HOME=%MAIN_HOME%\etc
set LIB_HOME=%MAIN_HOME%\lib
set CLASSPATH=%ETC_HOME%;%JAVA_HOME%\lib\tools.jar

for %%i in (%LIB_HOME%\*.jar) do set CLASSPATH=!CLASSPATH!;%%i

setenv.bat

@echo off
set SRC_DIR=%cd%

cd %~dp0
cd ..
set MAIN_HOME=%cd%

cd %SRC_DIR%

set BIN_HOME=%MAIN_HOME%\bin
set ETC_HOME=%MAIN_HOME%\etc
set LIB_HOME=%MAIN_HOME%\lib
set CLASSPATH=%ETC_HOME%;%JAVA_HOME%\lib\tools.jar

for %%i in (%LIB_HOME%\*.jar) do set CLASSPATH=!CLASSPATH!;%%i

公海赌船网址,project-one.bat

@echo off
@setlocal enableextensions enabledelayedexpansion
call setenv.bat

chcp 65001
java -cp %CLASSPATH% com.demo.project.one.Application
pause

bat文件的始末就不详细表明,有趣味能够百度询问一下,首借使为了拼接出总体的CLASSPATH,执行project-one-0.0.1.jar可执行jar包

project-one.bat

@echo off
@setlocal enableextensions enabledelayedexpansion
call setenv.bat

chcp 65001
java -cp %CLASSPATH% com.demo.project.one.Application
pause

bat文件的内容就不详细分解,有趣味可以百度通晓一下,首借使为着拼接出总体的CLASSPATH,执行project-one-0.0.1.jar可执行jar包

运行

点击project-one.bat运转程序
公海赌船网址 9

运行

点击project-one.bat运作程序
公海赌船网址 10

结语

项目终于开发示范达成,那里只是创立二个制作可进行jar包的子项目作为例子,你还足以创立多少个子项目,最终打包的时候合并相同的借助和布置文件,然后在bin中创设相应项指标实施文书即可,各样子项目之间也可开始展览相互重视。
如上开发技术不仅适用于可举办jar包的付出,同样适用于WEB项目标开发,具体仍然由项目必要决定。

文章项目源码已发表到Github:https://github.com/ZKHDEV/MultDependPjo

本文为笔者kMacro原创,转发请评释来源:http://www.jianshu.com/p/3fa98dd52520

结语

品类终于开发示范达成,那里只是创设三个成立可实施jar包的子项目作为例子,你还是能创立多个子项目,最终打包的时候合并相同的重视和安插文件,然后在bin中开创相应品种的实行理文件书即可,各种子项目之间也可举办相互重视。
以上开发技巧不仅适用于可实施jar包的支出,同样适用于WEB项指标付出,具体依旧由项目供给决定。

文章项目源码已发表到Github:https://github.com/ZKHDEV/MultDependPjo

正文为作者kMacro原创,转发请评释来源:http://www.jianshu.com/p/3fa98dd52520

相关文章