动我们于定义的借助包进行多工程依赖型之开销。Maven多工程依赖型开支流程。

  

Maven多工程依赖型支付流程

图片 1

前言

本篇文章基于Java开发小技巧(二):自定义Maven依赖丁创造的父工程project-monitor心想事成,运用我们由定义之负包进行多工程依赖型之开。

脚为多而实行Jar包项目之支出也条例,进行Maven多工程依赖型支出之上课。

前言

本篇文章基于Java开发小技巧(二):自定义Maven依赖遭遇开创的父工程project-monitor兑现,运用我们从定义的仗包进行多工程依赖型的付出。

下面为多可尽Jar包项目之开销也例,进行Maven多工程依赖型开发的上课。

急需分析

首先来拘禁一下封面图,我们若实现之效力是:
1.大抵个类型共享一个档之类似和法等通用内容
2.每个子项目单独导入所需要依靠,以及分级填充父项目配置文件中之占位符
3.子项目仍指定目录结构进行打包
4.所有子项目并入打包到一个集合之目录,共享依赖包和部署文件等情节
5.由包后目录结构:

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

哼啊,目标一目了然的,接下要拓展实际开支实现了

求分析

第一来拘禁一下封面图,我们只要贯彻之效益是:
1.大多单种类共享一个门类之近乎与艺术等通用内容
2.每个子项目单独导入所待因,以及个别填充父项目安排文件中之挤占位符
3.子项目按指定目录结构进行打包
4.所有子项目并打包到一个联合之目,共享依赖包及配备文件等内容
5.于包后目录结构:

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

吓啊,目标明显的,接下要拓展具体开支实现了

实现

实现

包配置

以达到一致首稿子中已经创造好了一个自定义的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文件

打包配置

以达到同样篇稿子中早已创办好了一个自定义的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文件

填充配置文件占位符

事先我们当爸爸项目之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上下文中定义了一个数源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,新建一个入口类来实行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();
    }
}

末了之种布局要图

色结构

测试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();
    }
}

末段之种组织使图
图片 2

打包

全副准备妥当,轮至花色于包了,在路根本目录执行以下Maven命令即可

mvn clean package

实行就后你见面发现target目的构造如图所示

target目录结构

project-one.zip就是咱而的起包结果,解压后您会意识,依赖包及部署文件就放在了独家的目下

zip包目录结构

打包

浑准备妥当,轮到花色于包了,在档次根本目录执行以下Maven命令即可

mvn clean package

履行就后您晤面发现target目的组织如图所示
图片 3
project-one.zip就是我们而的起包结果,解压后您会意识,依赖包跟部署文件就放在了各自的目下
图片 4

行文书

类支付成功,接下就是实施顺序了,以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运行程序

运作结果

运行

点击project-one.bat运作程序
图片 5

结语

品类终于开发示范了,这里只是创建一个打造而实行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。

相关文章