Maven组织项目进行编译、部署

Maven项目基本的结构说明如下:

mazhi  // 控制所有荐的编译、部署、发布
mazhi-app-parent  // 项目的父项目,有一些公共的设置可以被子项目继承
mazhi-core  // 基础服务项目,例如公共类等
mazhi-xxx 
 
其中mazhi和mazhi-app-parent是pom格式,而mazhi-core是jar格式,还可以是 war等格式。
我们以新建mazhi和mazhi-core项目为例说明一下。
新建Maven-project项目,过程配置如下:
 注意在“Create a simple project”前打钩。  
 
 
 
填写Group Id,Artifact Id,选择Packaging为pom 格式后,Finish即可。
 
同样的方式新建mazhi-app-parent模块,不过需要指定父模块为mazhi,如下:
 
新建父模块mazhi下的子模块mazhi-core,选择Maven-Module,指定父类为mazhi,如下:
 
一路点下去即可。
 
项目完成新建后如下:
 
 不过我们需要做一下调整,现在是mazhi-core直接继承了mazhi项目的配置,现在要继承mazhi-app-parent来继承配置,打开mazhi-core模块下的pom.xml文件,修改如下节点:
<parent>
    <groupId>org.mazhi</groupId>
    <artifactId>mazhi-app-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../mazhi-app-parent</relativePath>
  </parent>

注意添加relativePath节点。

 在mazhi项目下,右键pom.xml文件,选择Run as >> Maven Install后,Eclipse输出如下信息表示一切顺利!!
 
 
 
项目已经Build和Install了。我们可以看上一节的内容,将mazhi-core编译为jar包后扔到Nexus私服上,以便所有人引用这个公共类。
 
下面来了解一下Maven模块的基本结构,如下:
下面我们就可以基于Maven来组织项目的整个结构了。
 
Maven项目(根目录)
   |----src
   |     |----main
   |     |         |----java ——存放项目的.java文件
   |     |         |----resources ——存放项目资源文件,如spring boot, hibernate配置文件
   |     |----test
   |     |         |----java ——存放所有测试.java文件,如JUnit测试类
   |      |         |----resources ——存放项目资源文件,如spring boot, hibernate等配置文件
   |----target ——项目输出位置
   |----pom.xml ----Maven的配置文件
 
 
根据mazhi-core模块的pom.xml中配置说明如下:
<?xml version="1.0"?>
<project 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.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <!-- 项目的父项目 -->
    <parent>
       <groupId>org.mazhi</groupId>
       <artifactId>mazhi-app-parent</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <relativePath>../mazhi-app-parent</relativePath>
    </parent>

    <!-- groupId: groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app -->
    <groupId>org.mazhi</groupId>

    <!-- artifactId: 项目的通用名称 -->
    <artifactId>mazhi-core</artifactId>

    <!-- packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par -->
    <packaging>jar</packaging>

    <!-- version:项目的版本 -->
    <version>SNAPSHOT-0.0.1</version>

    <!-- 项目的名称, Maven 产生的文档用 -->
    <name>Mazhi Core</name>

    <!-- 哪个网站可以找到这个项目,提示如果 Maven 资源列表没有,可以直接上该网站寻找, Maven 产生的文档用 -->
    <url>http://mazhi.org</url>

    <!-- 项目的描述, Maven 产生的文档用 -->
    <description>A maven project to study maven.</description>

    <!-- 用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置 -->
    <distributionManagement>
        <repository>
            <id>nexus-releases</id>
            <url>http://ip:端口/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <url>http://ip:端口/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

    <!-- 依赖关系 -->
    <dependencies>
         <!-- 自动加入的依赖包,它们是通过项目坐标来找到依赖包的。所以用了maven之后就不需要再拷jar包了 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <!-- 依赖的范围:默认为compile -->
            <!--     test:测试范围有效。即编译和打包时不会加入该依赖包 -->
            <!--  compile:编译范围有效。即编译和打包时会将该依赖包一并加入 -->
            <!-- provided:编译和测试时有效,最后生成war包时不会加入该依赖包。比如web容器本身已包含的servlet-api.jar,再打包则会冲突 -->
            <!--  runtime:运行范围有效,编译时则不依赖 -->
            <scope>test</scope>
            <!-- <exclusions><exclusion></exclusion></exclusions> -->
            <!-- - exclusions表示只包括指定的项目,不包括相关的依赖。试想一下,两个三方jar依赖不同版本的日志包jar,项目会知道应该使用哪个吗?答案是否定的 -->
        </dependency>
    </dependencies>

</project>

  

微服务开发之Spring Boot

 
我们新建一个Maven Module,父类是mazhi,然后和mazhi-core模块一样,更改父模块为mazhi-app-parent。
 
在mazhi项目中的pom.xml中指定一些配置,如下:
<properties>
		<!-- 表示项目根目录 -->
		<main.basedir>${basedir}/..</main.basedir>
		<java.version>1.7</java.version>
		<spring.version>4.1.4.RELEASE</spring.version>
		<hibernate.api.version>1.0.1.Final</hibernate.api.version>
</properties>
<dependencyManagement>
		<dependencies>
			<dependency>
				Import dependency management from spring boot
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>1.2.1.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
</dependencyManagement>

这样子模块就可以引用这些属性。

在mazhi-app-parent项目中,配置spring boot集成maven的插件,如下:

 <!--  安装spring boot集成Maven的插件 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

在mazhi-service模块中引入Spring boot的包,如下:

 <!-- Add typical dependencies for a web application -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

在 org.mazhi.service包中新建Application.class类,内容如下:

package org.mazhi.service;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@EnableAutoConfiguration
public class Application {

    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

添加Spring boot的配置文件,放到java/main/resource下,内容如下:

# Server settings (ServerProperties)
server:
  port: 8090
  sessionTimeout: 30
#  contextPath: /

  # Tomcat specifics
  tomcat:
    accessLogEnabled: false
    protocolHeader: x-forwarded-proto
    remoteIpHeader: x-forwarded-for
    basedir:
    backgroundProcessorDelay: 30 # secs

management:
  address: 127.0.0.1
  port: 8090

info:
  app:
    name: springtest
    description: spring test
    version: 1.0.0

注意缩近和格式,不要随便做对齐什么的操作,这是一种约定。 

在这个类上右键,Run As >> Java Application,可以看到Eclipse的控制台输出如下信息,表示启动成功!!

可以用浏览器去访问一下这个服务,地址为:

http://localhost:8090/

浏览器会输出:

Hello World!
 
如果我们想要引用mazhi-core中的工具类,那么可以在 mazhi-service中引入,如下:
在<dependencies>节点中添加如下依赖:
  <dependency>
			<groupId>org.mazhi</groupId>
			<artifactId>mazhi-core</artifactId>
			<version>0.0.1-SNAPSHOT</version>
	   </dependency>

如果这时候没有对mazhi-core进行build和instaling过程时,可能会报错,需要对mazhi-core模块install一下,然后进行引入即可。

Maven项目有时候本身没错,但是项目名上显示红叉,这时候只要更新一下项目即可。

项目上右键 >> Maven >> Update Project .. 即可。

或者还报错的话,需要先运行mazhi项目下的pom.xml文件,install一下,保证几个子模块成功进行了build和installing过程。

 

 
 
 
 
 
 
 
 
 
 
 

剑指架构师系列-持续集成之Maven实现项目的编译、发布和部署的更多相关文章

  1. 剑指架构师系列-持续集成之Maven+Nexus+Jenkins+git+Spring boot

    1.Nexus与Maven 先说一下这个Maven是什么呢?大家都知道,Java社区发展的非常强大,封装各种功能的Jar包满天飞,那么如何才能方便的引入我们项目,为我所用呢?答案就是Maven,只需要 ...

  2. 剑指架构师系列-spring boot的logback日志记录

    Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志 ...

  3. 剑指架构师系列-Redis安装与使用

    1.安装Redis 我们在VMware中安装CentOS 64位系统后,在用户目录下下载安装Redis. 下载redis目前最稳定版本也是功能最完善,集群支持最好并加入了sentinel(哨兵-高可用 ...

  4. 剑指架构师系列-tomcat6通过IO复用实现connector

    由于tomcat6的配置文件如下: <Connector port="80" protocol="org.apache.coyote.http11.Http11Ni ...

  5. 剑指架构师系列-Struts2构造函数的循环依赖注入

    Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...

  6. 剑指架构师系列-tomcat6通过伪异步实现connector

    首先在StandardService中start接收请求的线程,如下: synchronized (connectors) { for (int i = 0; i < connectors.le ...

  7. 剑指架构师系列-Struts2的缓存

    Struts2的缓存中最重要的两个类就是ReferenceMap与ReferenceCache.下面来解释下ReferenceCache中的get()方法. public V get(final Ob ...

  8. 剑指架构师系列-Hibernate需要掌握的Annotation

    1.一对多的关系配置 @Entity @Table(name = "t_order") public class Order { @Id @GeneratedValue priva ...

  9. 剑指架构师系列-InnoDB存储引擎、Spring事务与缓存

    事务与锁是不同的.事务具有ACID属性: 原子性:持久性:由redo log重做日志来保证事务的原子性和持久性,一致性:undo log用来保证事务的一致性隔离性:一个事务在操作过程中看到了其他事务的 ...

随机推荐

  1. JavaScript的作用域链

    /* js当中 每个函数都是一个执行环境 函数调用函数会进入新的执行环境结束之后再回来当前 作用域链: 在内部的作用域中可以访问和修改外部的变量 在外部作用域不能修改或者访问内部的变量 */ var ...

  2. RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例

    之前写过一系列RxJava的文章,也承诺过会尽快有RxJava2的介绍.无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨.所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家 ...

  3. PageRank之基于C C#的基本实现

    重点不是说PageRank是什么,而是怎么用代码实现 什么是PageRank? PageRank,网页排名,又称网页级别.Google左侧排名或佩奇排名,是一种由[1]  根据网页之间相互的超链接计算 ...

  4. urlopen()&urlretrieve()

    1.urlopen()方法 urllib.request.urlopen(url[,data[,proxies]]) 创建一个表示远程url的类文件对象,然后像本地文件一样的操作这个类文件对象来获取远 ...

  5. 【微信小程序】对微信http请求API的封装,方便对错误码进行处理

    /**   * App 微信配置文件app.js   * author: nujey   * versions: 1.0.0   */   App({   /**   * @param {Object ...

  6. Angular CLI 安装

    安装Angular 官网的教程,因为国内网络环境原因,访问不了服务器,导致安装失败. 1.先安装NodeJs 安装教程:http://blog.csdn.net/zengmingen/article/ ...

  7. 机器学习基石:08 Noise and Error

    噪声:误标.对同一数据点的标注不一致.数据点信息不准确...... 噪声是针对整个输入空间的. 存在噪声的情况下,VC bound依旧有用: 存在噪声,就是f------>p(y|x),f是p的 ...

  8. Struts2--标签tag

    在Struts2框架中提供了一套标签库,可以与struts2无缝结合. 数据标签a.action.bean.date.debug.i18n.include.param.property.push.se ...

  9. [USACO 13DEC]Vacation Planning(gold)

    Description Air Bovinia operates flights connecting the N farms that the cows live on (1 <= N < ...

  10. [POI2016]Nim z utrudnieniem

    Description A和B两个人玩游戏,一共有m颗石子,A把它们分成了n堆,每堆石子数分别为a[1],a[2],...,a[n],每轮可以选择一堆石子,取掉任意颗石子,但不能不取.谁先不能操作,谁 ...