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. java中的引用类型的对象存放在哪里

    根据上下文来确定.比如void func(){    Object obj = new Object();//这个obj在函数的栈里.}class Test{   private Object obj ...

  2. CentOS7配置php7.0支持redis

    配置之前应该是环境已经搭好了,phpinfo的页面可以加载出来. 使用git clone下载git上的phpredis扩展包 [root@VM_103_117_centos ]#git clone   ...

  3. hdu4864 Task贪心好题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4864 题目大意: 有n个机器,m个任务.每个机器至多能完成一个任务.对于每个机器,有一个最大运行时间 ...

  4. poj1182-食物链-带权并查集-种类并查集

    (这应该是我写的第一个和带权并查集相关的题,还不是很了解,所以这篇博客我以后还会做修改,力求更号理解! 题意和思路: 中文题意,我简单提一下: A->B,B->C,C->A.A吃B, ...

  5. ASP.NET Core + Docker +Jenkins 实现持续集成

    1.新建一个ASP.NET Core MVC应用程序: 2.将其上传到git: 3.建立Jenkins任务 (1)选择"新建任务",输入任务名称,选择"自由风格项目&qu ...

  6. Jenkins持续集成演示

    1.去我们的仓库修改一下代码 为了节约时间,我直接在网页上改了. 我们把布局页的footer信息改一下: 然后提交. 2.切换到Jenkins可以看到已经在构建了 等待构建完成. 3.访问我们部署的地 ...

  7. BeautifulSoup 用法

    一.标签选择器 1.子节点contents ,child(迭代器), 2.子孙节点 descendants(迭代器) 3.父节点 parent 4.祖节点  parents 5.兄弟节点 next_s ...

  8. Spring-cloud(五) 使用Ribbon进行Restful请求

    写在前面 本文由markdown格式写成,为本人第一次这么写,排版可能会有点乱,还望各位海涵. 主要写的是使用Ribbon进行Restful请求,测试各个方法的使用,代码冗余较高,比较适合初学者,介意 ...

  9. python学习笔记1--python简介和第一行代码编写

    一.什么是python? python是一种面向对象,解释型语言,它语法简介,容易学习.本节博客就来说说本人学习python的心得体会. 二.python环境安装 目前python版本有python2 ...

  10. 用Python浅析股票数据

    用Python浅析股票数据 本文将使用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系,最后使用移动平均线方法初探投资策略. 数据导入 这里将股票数据存储在stockData ...