以太坊客户端Geth命令用法-参数详解

 eth, 区块链  以太坊客户端Geth命令用法-参数详解已关闭评论
10月 162018
 

geth的命令行详解,备用。

geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具。
熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册。 本文主要是对geth help的翻译,基于最新的geth 1.7.3-stable版本。

命令用法

geth [选项] 命令 [命令选项] [参数…]

版本:

1.7.3-stable

命令:

account    管理账户
attach     启动交互式JavaScript环境(连接到节点)
bug        上报bug Issues
console    启动交互式JavaScript环境
copydb     从文件夹创建本地链
dump       Dump(分析)一个特定的块存储
dumpconfig 显示配置值
export     导出区块链到文件
import     导入一个区块链文件
init       启动并初始化一个新的创世纪块
js         执行指定的JavaScript文件(多个)
license    显示许可信息
makecache  生成ethash验证缓存(用于测试)
makedag    生成ethash 挖矿DAG(用于测试)
monitor    监控和可视化节点指标
removedb   删除区块链和状态数据库
version    打印版本号
wallet     管理Ethereum预售钱包
help,h     显示一个命令或帮助一个命令列表

ETHEREUM选项:

--config value          TOML 配置文件
--datadir “xxx”         数据库和keystore密钥的数据目录
--keystore              keystore存放目录(默认在datadir内)
--nousb                 禁用监控和管理USB硬件钱包
--networkid value       网络标识符(整型, 1=Frontier, 2=Morden (弃用), 3=Ropsten, 4=Rinkeby) (默认: 1)
--testnet               Ropsten网络:预先配置的POW(proof-of-work)测试网络
--rinkeby               Rinkeby网络: 预先配置的POA(proof-of-authority)测试网络
--syncmode "fast"       同步模式 ("fast", "full", or "light")
--ethstats value        上报ethstats service  URL (nodename:secret@host:port)
--identity value        自定义节点名
--lightserv value       允许LES请求时间最大百分比(0 – 90)(默认值:0) 
--lightpeers value      最大LES client peers数量(默认值:20)
--lightkdf              在KDF强度消费时降低key-derivation RAM&CPU使用

开发者(模式)选项:

--dev               使用POA共识网络,默认预分配一个开发者账户并且会自动开启挖矿。
--dev.period value  开发者模式下挖矿周期 (0 = 仅在交易时) (默认: 0)

ETHASH 选项:

--ethash.cachedir                        ethash验证缓存目录(默认 = datadir目录内)
--ethash.cachesinmem value               在内存保存的最近的ethash缓存个数  (每个缓存16MB ) (默认: 2)
--ethash.cachesondisk value              在磁盘保存的最近的ethash缓存个数 (每个缓存16MB) (默认: 3)
--ethash.dagdir ""                       存ethash DAGs目录 (默认 = 用户hom目录)
--ethash.dagsinmem value                 在内存保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 1)
--ethash.dagsondisk value                在磁盘保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 2)

交易池选项:

--txpool.nolocals            为本地提交交易禁用价格豁免
--txpool.journal value       本地交易的磁盘日志:用于节点重启 (默认: "transactions.rlp")
--txpool.rejournal value     重新生成本地交易日志的时间间隔 (默认: 1小时)
--txpool.pricelimit value    加入交易池的最小的gas价格限制(默认: 1)
--txpool.pricebump value     价格波动百分比(相对之前已有交易) (默认: 10)
--txpool.accountslots value  每个帐户保证可执行的最少交易槽数量  (默认: 16)
--txpool.globalslots value   所有帐户可执行的最大交易槽数量 (默认: 4096)
--txpool.accountqueue value  每个帐户允许的最多非可执行交易槽数量 (默认: 64)
--txpool.globalqueue value   所有帐户非可执行交易最大槽数量  (默认: 1024)
--txpool.lifetime value      非可执行交易最大入队时间(默认: 3小时)

性能调优的选项:

--cache value                分配给内部缓存的内存MB数量,缓存值(最低16 mb /数据库强制要求)(默认:128)
--trie-cache-gens value      保持在内存中产生的trie node数量(默认:120)

帐户选项:

--unlock value              需解锁账户用逗号分隔
--password value            用于非交互式密码输入的密码文件

API和控制台选项:

--rpc                       启用HTTP-RPC服务器
--rpcaddr value             HTTP-RPC服务器接口地址(默认值:“localhost”)
--rpcport value             HTTP-RPC服务器监听端口(默认值:8545)
--rpcapi value              基于HTTP-RPC接口提供的API
--ws                        启用WS-RPC服务器
--wsaddr value              WS-RPC服务器监听接口地址(默认值:“localhost”)
--wsport value              WS-RPC服务器监听端口(默认值:8546)
--wsapi  value              基于WS-RPC的接口提供的API
--wsorigins value           websockets请求允许的源
--ipcdisable                禁用IPC-RPC服务器
--ipcpath                   包含在datadir里的IPC socket/pipe文件名(转义过的显式路径)
--rpccorsdomain value       允许跨域请求的域名列表(逗号分隔)(浏览器强制)
--jspath loadScript         JavaScript加载脚本的根路径(默认值:“.”)
--exec value                执行JavaScript语句(只能结合console/attach使用)
--preload value             预加载到控制台的JavaScript文件列表(逗号分隔)

网络选项:

--bootnodes value    用于P2P发现引导的enode urls(逗号分隔)(对于light servers用v4+v5代替)
--bootnodesv4 value  用于P2P v4发现引导的enode urls(逗号分隔) (light server, 全节点)
--bootnodesv5 value  用于P2P v5发现引导的enode urls(逗号分隔) (light server, 轻节点)
--port value         网卡监听端口(默认值:30303)
--maxpeers value     最大的网络节点数量(如果设置为0,网络将被禁用)(默认值:25)
--maxpendpeers value    最大尝试连接的数量(如果设置为0,则将使用默认值)(默认值:0)
--nat value             NAT端口映射机制 (any|none|upnp|pmp|extip:<IP>) (默认: “any”)
--nodiscover            禁用节点发现机制(手动添加节点)
--v5disc                启用实验性的RLPx V5(Topic发现)机制
--nodekey value         P2P节点密钥文件
--nodekeyhex value      十六进制的P2P节点密钥(用于测试)

矿工选项:

--mine                  打开挖矿
--minerthreads value    挖矿使用的CPU线程数量(默认值:8)
--etherbase value       挖矿奖励地址(默认=第一个创建的帐户)(默认值:“0”)
--targetgaslimit value  目标gas限制:设置最低gas限制(低于这个不会被挖?) (默认值:“4712388”)
--gasprice value        挖矿接受交易的最低gas价格
--extradata value       矿工设置的额外块数据(默认=client version)

GAS价格选项:

--gpoblocks value      用于检查gas价格的最近块的个数  (默认: 10)
--gpopercentile value  建议gas价参考最近交易的gas价的百分位数,(默认: 50)

虚拟机的选项:

--vmdebug        记录VM及合约调试信息

日志和调试选项:

--metrics            启用metrics收集和报告
--fakepow            禁用proof-of-work验证
--verbosity value    日志详细度:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)
--vmodule value      每个模块详细度:以 <pattern>=<level>的逗号分隔列表 (比如 eth/*=6,p2p=5)
--backtrace value    请求特定日志记录堆栈跟踪 (比如 “block.go:271”)
--debug                     突出显示调用位置日志(文件名及行号)
--pprof                     启用pprof HTTP服务器
--pprofaddr value           pprof HTTP服务器监听接口(默认值:127.0.0.1)
--pprofport value           pprof HTTP服务器监听端口(默认值:6060)
--memprofilerate value      按指定频率打开memory profiling    (默认:524288)
--blockprofilerate value    按指定频率打开block profiling    (默认值:0)
--cpuprofile value          将CPU profile写入指定文件
--trace value               将execution trace写入指定文件

WHISPER实验选项:

--shh                        启用Whisper
--shh.maxmessagesize value   可接受的最大的消息大小 (默认值: 1048576)
--shh.pow value              可接受的最小的POW (默认值: 0.2)

弃用选项:

--fast     开启快速同步
--light    启用轻客户端模式

其他选项:

–help, -h    显示帮助
转自:https://learnblockchain.cn/2017/11/29/geth_cmd_options/

ssh如何通过跳板机直接访问到后端服务器(Mac&Linux&Windows解决方案)

 linux, ssh  ssh如何通过跳板机直接访问到后端服务器(Mac&Linux&Windows解决方案)已关闭评论
9月 212018
 

记录下,转自:https://my.oschina.net/foreverich/blog/657075

前言

如果公司的服务器在外网,一般会设置一个跳板机,访问公司其他服务器都需要从跳板机做一个ssh跳转,外网的服务器基本都要通过证书登录的。于是我们面临一个情况,本机ssh->跳板机->目标机器。如果直接在跳板机上放置公私钥对,并将跳板机上的公钥放到目标机器上,这样可以直接登录。但这样会有一个问题,跳板机上的root权限的用户可以获取普通用户的公私钥对,就算对私钥设置了密码,但是从安全角度来看,这样还是失去了保障,失去了服务器的一部分安全性。

如何来解决这个问题呢,其实ssh协议本身是支持秘钥转发的,不需要在跳板机上放置公私钥。

Linux(Mac)下有如下两种方式:

方式一:

从linux客户端的ssh跳转时,执行命令

ssh username@跳板机ip

然后在跳板机上跳转到目标机器

ssh username@目标机器ip

跳板机ip和目标机器ip,username账户下已经在相应的 .ssh/authorized_keys 加入了公钥,配置是没有问题了,但是我们会遇到一个Pubkey Unauthorization的错误,因跳板机没有username的私钥。问题总是会有,解决方法也总是有,ssh是有转发密钥的功能,从本机跳转到跳板机时可以把私钥转发过去。

正确做法是,在本机linux客户端执行命令 ssh -A username@跳板机ip

-A表示转发密钥,所以跳转到跳板机,密钥也转发了过来

接下来我们再在跳板机执行命令 ssh username@目标机器ip

另外可以配置本机客户端的默认配置文件,修改为默认转发密钥:

修改ssh_config(不是sshd_config,一般在/etc或者/etc/ssh下):

把 #ForwardAgent no 改为 ForwardAgent Yes

方式二:

ssh username@目标机器ip -p 22 -o ProxyCommand=’ssh -p 22 username@跳板机ip -W %h:%p’

也可以修改配置文件 ~/.ssh/config , 若没有则创建:

Host tiaoban #任意名字,随便使用 HostName 192.168.1.1 #这个是跳板机的IP,支持域名 Port 22 #跳板机端口 User username_tiaoban #跳板机用户 Host nginx #同样,任意名字,随便起 HostName 192.168.1.2 #真正登陆的服务器,不支持域名必须IP地址 Port 22 #服务器的端口 User username #服务器的用户 ProxyCommand ssh username_tiaoban@tiaoban -W %h:%p



Host 10.10.0.* #可以用*通配符 Port 22 #服务器的端口 User username #服务器的用户 ProxyCommand ssh username_tiaoban@tiaoban -W %h:%p

配置好后, 直接 ssh nginx 就可以登录 192.168.1.2 这台跳板机后面的服务器。 也可以用 ssh username@10.10.0.xx 来登录10.10.0.27, 10.10.10.33, …. 等机器。

windows SecureCRT密钥转发

windows下SecureCRT配置转发,需要做以下设置

输入图片说明

部分linux系统, ftpclient 调用 listFiles返回[]空数组问题解决

 ftp  部分linux系统, ftpclient 调用 listFiles返回[]空数组问题解决已关闭评论
7月 202018
 

做项目时碰到测试机ubuntu14.04 调用ftpclient的 listFiles时正常返回文件数组,  但发布到阿里云centos 机器, 调用时确返回空数组, 可以采用下面的方法解决:

在调用listFiles前先调用下 ftpClient.enterLocalPassiveMode() ,  此方法会打开一个端口用于数据传输。


阿里云FTP如果还不能解决, 开启被动模式 

vi /etc/vsftpd/vsftpd.conf 
pasv_enable=YES
pasv_min_port=3000
pasv_max_port=3005

阿里云安全组 把端口3000-3005的端口都发放 就成功了

apache 的commons下有个DBUtils, 封装了jdbc的实现(c3p0和QueryRunner的结合使用)

 dbutils  apache 的commons下有个DBUtils, 封装了jdbc的实现(c3p0和QueryRunner的结合使用)已关闭评论
6月 012018
 

最近刚发现apache 的commons下有个DBUtils, 封装了jdbc的实现,用起来真方便,分享一篇文章:https://www.cnblogs.com/biehongli/p/6536072.html

1DBUtils中的QueryRunner的使用:

1.1QueryRunner中提供了对SQL语句操作的api

1.2:主要有三个方法:

1.2.1query():用于执行select(查询);

1.2.2update():用于执行insert(插入)/update(更新)/delete(删除);

1.2.3batch():批处理;

2c3p0QueryRunner的结合使用:

2.1:首先导包,如下所示的包;

c3p0-0.9.1.2.jar
commons-dbutils-1.6.jar
mysql-connector-java-5.1.12-bin.jar

  2.2:当然导包之前你需要创建好数据库和数据表哦!~~~

  
src目录下面记住配置c3p0-config.xml文件

<c3p0-config>
    
    <!– c3p0默认配置,下面还可以配置多个数据库 –>
    <default-config>
        <property name=”jdbcUrl”>jdbc:mysql://localhost:3306/test
        </property>
        <property name=”driverClass”>com.mysql.jdbc.Driver</property>
        <property name=”user”>root</property>
        <property name=”password”>123456</property>
        <property name=”initialPoolSize”>6</property>
        <property name=”maxPoolSize”>50</property>
        <property name=”maxIdleTime”>1000</property>
    </default-config>

</c3p0-config>

2.3:创建实体类,如User.java,源码如下,

package com.bie.po;
/** 
* @author BieHongLi 
* @version 创建时间:2017年3月11日 下午12:55:21 

*/
public class User {

    private int id;
    private String name;
    private String password;
    private String email;
    private String phone;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    @Override
    public String toString() {
        return “User [id=” + id + “, name=” + name + “, password=” + password + “, email=” + email + “, phone=” + phone
                + “]”;
    }
    
    
}

2.4:创建好实体类之后就可以根据MVC模式分层进行开发,这里只是模拟,所以创建dao层和servic层和test层。test层进行测试;

所以先创建dao层进行创建接口,再创建实现接口的类,当然实现c3p0QueryRunner的关键代码就是dao层哦,切记;

当然了还有工具类utils层提取的公共的方法;

package com.bie.dao;

import java.util.List;

import com.bie.po.User;

/** 
* @author BieHongLi 
* @version 创建时间:2017年3月11日 下午5:46:38 

*/
public interface UserDao {

    /***
     * 查询所有的用户信息
     * @return
     */
    public List<User> selectUser();
    
    /***
     * 根据编号查询
     * @param id
     * @return
     */
    public User selectUserId(int id);
    
    
    /***
     * 根据条件查询信息
     * @param user
     * @return
     */
    public List<User> select(String sql,List<Object> list);
    
    
}

package com.bie.dao.impl;

import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.bie.dao.UserDao;
import com.bie.po.User;
import com.bie.util.BaseUtils;

/** 
* @author BieHongLi 
* @version 创建时间:2017年3月11日 下午5:47:35 

*/
public class UserDaoImpl implements UserDao{

    @Override
    public List<User> selectUser() {
        //创建QueryRunner
        //记住查询是BeanListHandler区别增删改的方法BeanHandler
        QueryRunner qr=BaseUtils.getQueryRunner();
        try {
            String sql=”select * from user “;
            //这句话就相当于之前写的下面这一长串代码,这就是QueryRunner的方便之处
            /***
             *User user=new User();
               user.setId(rs.getInt(“id”));
               user.setName(rs.getString(“name”));
               user.setPassword(rs.getString(“password”));
               user.setEmail(rs.getString(“email”));
               user.setPhone(rs.getString(“phone”));
             */
            return qr.query(sql, new BeanListHandler<User>(User.class));
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public User selectUserId(int id) {
        //创建QueryRunner
        QueryRunner qr=BaseUtils.getQueryRunner();
        String sql=”select * from user where id=? “;
        try {
            //使用QueryRunner的强大之处在于此处。
            return qr.query(sql,new BeanHandler<User>(User.class), id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public List<User> select(String sql,List<Object> list) {
        //创建QueryRunner
        QueryRunner qr=BaseUtils.getQueryRunner();
        try {
            //第一个参数是传来的sql,第二个是实现实体类的设置,第三个是集合转化为数组
            return qr.query(sql, new BeanListHandler<User>(User.class), list.toArray());
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    
}

这里将BaseUtils类写到这里,因为这个也是c3p0QueryRunner的核心

package com.bie.util;

import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.dbutils.QueryRunner;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/** 
* @author BieHongLi 
* @version 创建时间:2017年3月11日 下午1:29:50 
* 数据库连接工具类
*/
public class BaseUtils {

    //初始化c3p0
    private static DataSource dataSource=null;
    
    static{
        //自动加载src目录下面的c3p0的配置文件,【c3p0-config.xml】
        dataSource = new ComboPooledDataSource();
    }
    
    public static QueryRunner getQueryRunner(){
        //第一步:创建QueryRunner对象,传入连接池对象
        //在创建QueryRunner对象的时候,如果传入数据对象dataSource,
        //那么在使用QueryRunner对象的方法时候,就不需要传入连接对象
        QueryRunner query=new QueryRunner(dataSource);
        //第二步:会自动从数据源中获取连接(不用关闭连接)
        return query;
    }
    
    /***
     * 实现增删改的公共方法
     * @param sql
     * @param arr
     * @return
     */
    public static boolean addUpdateDelete(String sql,Object[] arr){
        QueryRunner qr=getQueryRunner();
        int count;
        try {
            count = qr.update(sql, arr);
            if(count>0){
                return true;
            }else{
                return false;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
    
}

2.5:完成dao层和BaseUtils层之后可以直接在service层进行增删改,

package com.bie.service;

import java.util.List;

import com.bie.po.User;

/** 
* @author BieHongLi 
* @version 创建时间:2017年3月11日 下午7:10:32 

*/
public interface UserService {

    /***
     * 根据条件查询用户信息
     * @param user
     * @return
     */
    public List<User> select(User user);
    
    /***
     * 添加用户信息
     * @param user
     * @return
     */
    public boolean insertUser(User user);
    
    /***
     * 修改用户的信息
     * @param user
     * @return
     */
    public boolean updateUser(User user);
    
    /***
     * 删除用户信息
     * @param id
     * @return
     */
    public boolean deleteUser(int id);
}

package com.bie.service.impl;

import java.util.ArrayList;
import java.util.List;

import com.bie.dao.UserDao;
import com.bie.dao.impl.UserDaoImpl;
import com.bie.po.User;
import com.bie.service.UserService;
import com.bie.util.BaseUtils;

/** 
* @author BieHongLi 
* @version 创建时间:2017年3月11日 下午7:10:48 

*/
public class UserServiceImpl implements UserService{
    
    private UserDao dao=new UserDaoImpl();
    
    @Override
    public List<User> select(User user) {
        StringBuilder sql=new StringBuilder(“select * from user where 1=1 “);
        List<Object> list=new ArrayList<Object>();
        if(user!=null){
            //根据编号查询
            if(user.getId()!=0 && !””.equals(user.getId())){
                sql.append(” and id = ? “);
                list.add(user.getId());
            }
            
            //根据名称模糊查询,模糊查询”” %% “” ++
            if(user.getName()!=null && !””.equals(user.getName())){
                sql.append(” and name like ? “);
                list.add(“%”+user.getName()+”%”);
            }
        }
        
        return dao.select(sql.toString(), list);
    }

    @Override
    public boolean insertUser(User user) {
        String sql=”insert into user values(0,?,?,?,?)”;
        List<Object> list=new ArrayList<>();
        if(user!=null){
            list.add(user.getName());
            list.add(user.getPassword());
            list.add(user.getEmail());
            list.add(user.getPhone());
        }
        try {
            return BaseUtils.addUpdateDelete(sql, list.toArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    @Override
    public boolean updateUser(User user) {
        String sql=”update user set name=?,password=?,email=?,phone=? where id=? “;
        List<Object> list=new ArrayList<>();
        if(user!=null){
            list.add(user.getName());
            list.add(user.getPassword());
            list.add(user.getEmail());
            list.add(user.getPhone());
            
            //根据编号修改信息
            list.add(user.getId());
        }
        
        try {
            return BaseUtils.addUpdateDelete(sql, list.toArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    @Override
    public boolean deleteUser(int id) {
        String sql=”delete from user where id=? “;
        List<Object> list=new ArrayList<>();
        if(id!=0){
            //根据编号修改信息
            list.add(id);
        }
        
        try {
            return BaseUtils.addUpdateDelete(sql, list.toArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    
}

2.6:使用junit测试,完成使用c3p0QueryRunner的练习;

package com.bie.test;

import java.util.List;

import org.junit.Test;

import com.bie.dao.UserDao;
import com.bie.dao.impl.UserDaoImpl;
import com.bie.po.User;
import com.bie.service.UserService;
import com.bie.service.impl.UserServiceImpl;

/** 
* @author BieHongLi 
* @version 创建时间:2017年3月11日 下午5:57:25 

*/
public class QueryRunnerTest {

    private UserDao dao=new UserDaoImpl();
    private UserService service=new UserServiceImpl();
    
    //查询所有信息的测试
    @Test
    public void selectUser(){
        List<User> list=dao.selectUser();
        for(User u:list){
            System.out.println(u);
        }
    }
    
    //根绝id查询的信息
    @Test
    public void selectUserId(){
        User user=dao.selectUserId(1);
        System.out.println(user);
    }
    
    //根据条件查询信息
    @Test
    public void select(){
        User user=new User();
        user.setName(“张三”);
        List<User> list=service.select(user);
        for(User u:list){
            System.out.println(u);
        }
    }
    
    @Test
    public void insertUser(){
        User user=new User();
        user.setName(“张三”);
        user.setPassword(“123456”);
        user.setEmail(“1748@qq.com”);
        user.setPhone(“11223”);
        
        boolean mark=service.insertUser(user);
        if(mark){
            System.out.println(“插入成功”);
        }else{
            System.out.println(“插入失败”);
        }
    }
    
    
    @Test
    public void update(){
        User user=new User();
        user.setName(“李四”);
        user.setId(1);
        
        boolean mark=service.updateUser(user);
        if(mark){
            System.out.println(“修改成功”);
        }else{
            System.out.println(“修改失败”);
        }
    }
    
    @Test
    public void delete(){
        boolean mark=service.deleteUser(1);
        if(mark){
            System.out.println(“用户信息删除成功”);
        }else{
            System.out.println(“用户信息删除失败”);
        }
    }
    
}

maven POM.xml 标签详解

 MAVEN  maven POM.xml 标签详解已关闭评论
5月 282018
 

作为参考资料,记录下:

转自:http://blog.csdn.net/sunzhenhua0608/article/details/32938533 

 pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素

具体描述如下:

<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.0http://maven.apache.org/maven-v4_0_0.xsd”>     
    <!–父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。–>    
    <parent>    
     <!–被继承的父项目的构件标识符–>    
     <artifactId/>    
     <!–被继承的父项目的全球唯一标识符–>    
     <groupId/>    
     <!–被继承的父项目的版本–>    
     <version/>    
     <!– 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项 目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。–>    
     <relativePath/>    
 </parent>    
 <!–声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。–>       
    <modelVersion>4.0.0</modelVersion>     
    <!–项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app–>     
    <groupId>asia.banseon</groupId>     
    <!– 构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个 特定的group ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等。–>     
    <artifactId>banseon-maven2</artifactId>     
    <!–项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型–>     
    <packaging>jar</packaging>     
    <!–项目当前版本,格式为:主版本.次版本.增量版本-限定版本号–>     
    <version>1.0-SNAPSHOT</version>     
    <!–项目的名称, Maven产生的文档用–>     
    <name>banseon-maven</name>     
    <!–项目主页的URL, Maven产生的文档用–>     
    <url>http://www.baidu.com/banseon</url>     
    <!– 项目的详细描述, Maven 产生的文档用。  当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标 签), 不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。–>     
    <description>A maven project to study maven.</description>     
    <!–描述了这个项目构建环境中的前提条件。–>    
 <prerequisites>    
  <!–构建该项目或使用该插件所需要的Maven的最低版本–>    
    <maven/>    
 </prerequisites>    
 <!–项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira–>     
    <issueManagement>    
     <!–问题管理系统(例如jira)的名字,–>     
        <system>jira</system>     
        <!–该项目使用的问题管理系统的URL–>    
        <url>http://jira.baidu.com/banseon</url>     
    </issueManagement>     
    <!–项目持续集成信息–>    
 <ciManagement>    
  <!–持续集成系统的名字,例如continuum–>    
  <system/>    
  <!–该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。–>    
  <url/>    
  <!–构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告)–>    
  <notifiers>    
   <!–配置一种方式,当构建中断时,以该方式通知用户/开发者–>    
   <notifier>    
    <!–传送通知的途径–>    
    <type/>    
    <!–发生错误时是否通知–>    
    <sendOnError/>    
    <!–构建失败时是否通知–>    
    <sendOnFailure/>    
    <!–构建成功时是否通知–>    
    <sendOnSuccess/>    
    <!–发生警告时是否通知–>    
    <sendOnWarning/>    
    <!–不赞成使用。通知发送到哪里–>    
    <address/>    
    <!–扩展配置项–>    
    <configuration/>    
   </notifier>    
  </notifiers>    
 </ciManagement>    
 <!–项目创建年份,4位数字。当产生版权信息时需要使用这个值。–>    
    <inceptionYear/>    
    <!–项目相关邮件列表信息–>     
    <mailingLists>    
     <!–该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。–>     
        <mailingList>     
         <!–邮件的名称–>    
            <name>Demo</name>     
            <!–发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建–>     
            <post>banseon@126.com</post>     
            <!–订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建–>     
            <subscribe>banseon@126.com</subscribe>     
            <!–取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建–>     
            <unsubscribe>banseon@126.com</unsubscribe>     
            <!–你可以浏览邮件信息的URL–>    
            <archive>http:/hi.baidu.com/banseon/demo/dev/</archive>     
        </mailingList>     
    </mailingLists>     
    <!–项目开发者列表–>     
    <developers>     
     <!–某个项目开发者的信息–>    
        <developer>     
         <!–SCM里项目开发者的唯一标识符–>    
            <id>HELLO WORLD</id>     
            <!–项目开发者的全名–>    
            <name>banseon</name>     
            <!–项目开发者的email–>    
            <email>banseon@126.com</email>     
            <!–项目开发者的主页的URL–>    
            <url/>    
            <!–项目开发者在项目中扮演的角色,角色元素描述了各种角色–>    
            <roles>     
                <role>Project Manager</role>     
                <role>Architect</role>     
            </roles>    
            <!–项目开发者所属组织–>    
            <organization>demo</organization>     
            <!–项目开发者所属组织的URL–>    
            <organizationUrl>http://hi.baidu.com/banseon</organizationUrl>     
            <!–项目开发者属性,如即时消息如何处理等–>    
            <properties>     
                <dept>No</dept>     
            </properties>    
            <!–项目开发者所在时区, -11到12范围内的整数。–>    
            <timezone>-5</timezone>     
        </developer>     
    </developers>     
    <!–项目的其他贡献者列表–>     
    <contributors>    
     <!–项目的其他贡献者。参见developers/developer元素–>    
     <contributor>    
   <name/><email/><url/><organization/><organizationUrl/><roles/><timezone/><properties/>    
     </contributor>         
    </contributors>       
    <!–该元素描述了项目所有License列表。 应该只列出该项目的license列表,不要列出依赖项目的 license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license。–>     
    <licenses>    
     <!–描述了项目的license,用于生成项目的web站点的license页面,其他一些报表和validation也会用到该元素。–>     
        <license>    
         <!–license用于法律上的名称–>    
            <name>Apache 2</name>     
            <!–官方的license正文页面的URL–>    
            <url>http://www.baidu.com/banseon/LICENSE-2.0.txt</url>     
            <!–项目分发的主要方式:    
              repo,可以从Maven库下载    
              manual, 用户必须手动下载和安装依赖–>    
            <distribution>repo</distribution>     
            <!–关于license的补充信息–>    
            <comments>A business-friendly OSS license</comments>     
        </license>     
    </licenses>     
    <!–SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。–>     
    <scm>     
        <!–SCM的URL,该URL描述了版本库和如何连接到版本库。欲知详情,请看SCMs提供的URL格式和列表。该连接只读。–>     
        <connection>     
            scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)      
        </connection>     
        <!–给开发者使用的,类似connection元素。即该连接不仅仅只读–>    
        <developerConnection>     
            scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk      
        </developerConnection>    
        <!–当前代码的标签,在开发阶段默认为HEAD–>    
        <tag/>           
        <!–指向项目的可浏览SCM库(例如ViewVC或者Fisheye)的URL。–>     
        <url>http://svn.baidu.com/banseon</url>     
    </scm>     
    <!–描述项目所属组织的各种属性。Maven产生的文档用–>     
    <organization>     
     <!–组织的全名–>    
        <name>demo</name>     
        <!–组织主页的URL–>    
        <url>http://www.baidu.com/banseon</url>     
    </organization>    
    <!–构建项目需要的信息–>    
    <build>    
     <!–该元素设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。–>    
  <sourceDirectory/>    
  <!–该元素设置了项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容 会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。–>    
  <scriptSourceDirectory/>    
  <!–该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。–>    
  <testSourceDirectory/>    
  <!–被编译过的应用程序class文件存放的目录。–>    
  <outputDirectory/>    
  <!–被编译过的测试class文件存放的目录。–>    
  <testOutputDirectory/>    
  <!–使用来自该项目的一系列构建扩展–>    
  <extensions>    
   <!–描述使用到的构建扩展。–>    
   <extension>    
    <!–构建扩展的groupId–>    
    <groupId/>    
    <!–构建扩展的artifactId–>    
    <artifactId/>    
    <!–构建扩展的版本–>    
    <version/>    
   </extension>    
  </extensions>    
  <!–当项目没有规定目标(Maven2 叫做阶段)时的默认值–>    
  <defaultGoal/>    
  <!–这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。–>    
  <resources>    
   <!–这个元素描述了项目相关或测试相关的所有资源路径–>    
   <resource>    
    <!– 描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。举个例 子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven /messages。然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。–>    
    <targetPath/>    
    <!–是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。–>    
    <filtering/>    
    <!–描述存放资源的目录,该路径相对POM路径–>    
    <directory/>    
    <!–包含的模式列表,例如**/*.xml.–>    
    <includes/>    
    <!–排除的模式列表,例如**/*.xml–>    
    <excludes/>    
   </resource>    
  </resources>    
  <!–这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。–>    
  <testResources>    
   <!–这个元素描述了测试相关的所有资源路径,参见build/resources/resource元素的说明–>    
   <testResource>    
    <targetPath/><filtering/><directory/><includes/><excludes/>    
   </testResource>    
  </testResources>    
  <!–构建产生的所有文件存放的目录–>    
  <directory/>    
  <!–产生的构件的文件名,默认值是${artifactId}-${version}。–>    
  <finalName/>    
  <!–当filtering开关打开时,使用到的过滤器属性文件列表–>    
  <filters/>    
  <!–子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置–>    
  <pluginManagement>    
   <!–使用的插件列表 。–>    
   <plugins>    
    <!–plugin元素包含描述插件所需要的信息。–>    
    <plugin>    
     <!–插件在仓库里的group ID–>    
     <groupId/>    
     <!–插件在仓库里的artifact ID–>    
     <artifactId/>    
     <!–被使用的插件的版本(或版本范围)–>    
     <version/>    
     <!–是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。–>    
     <extensions/>    
     <!–在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。–>    
     <executions>    
      <!–execution元素包含了插件执行需要的信息–>    
      <execution>    
       <!–执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标–>    
       <id/>    
       <!–绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段–>    
       <phase/>    
       <!–配置的执行目标–>    
       <goals/>    
       <!–配置是否被传播到子POM–>    
       <inherited/>    
       <!–作为DOM对象的配置–>    
       <configuration/>    
      </execution>    
     </executions>    
     <!–项目引入插件所需要的额外依赖–>    
     <dependencies>    
      <!–参见dependencies/dependency元素–>    
      <dependency>    
       ……    
      </dependency>    
     </dependencies>         
     <!–任何配置是否被传播到子项目–>    
     <inherited/>    
     <!–作为DOM对象的配置–>    
     <configuration/>    
    </plugin>    
   </plugins>    
  </pluginManagement>    
  <!–使用的插件列表–>    
  <plugins>    
   <!–参见build/pluginManagement/plugins/plugin元素–>    
   <plugin>    
    <groupId/><artifactId/><version/><extensions/>    
    <executions>    
     <execution>    
      <id/><phase/><goals/><inherited/><configuration/>    
     </execution>    
    </executions>    
    <dependencies>    
     <!–参见dependencies/dependency元素–>    
     <dependency>    
      ……    
     </dependency>    
    </dependencies>    
    <goals/><inherited/><configuration/>    
   </plugin>    
  </plugins>    
 </build>    
 <!–在列的项目构建profile,如果被激活,会修改构建处理–>    
 <profiles>    
  <!–根据环境参数或命令行参数激活某个构建处理–>    
  <profile>    
   <!–构建配置的唯一标识符。即用于命令行激活,也用于在继承时合并具有相同标识符的profile。–>    
   <id/>    
   <!–自动触发profile的条件逻辑。Activation是profile的开启钥匙。profile的力量来自于它    
   能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。–>    
   <activation>    
    <!–profile默认是否激活的标志–>    
    <activeByDefault/>    
    <!–当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。–>    
    <jdk/>    
    <!–当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。–>    
    <os>    
     <!–激活profile的操作系统的名字–>    
     <name>Windows XP</name>    
     <!–激活profile的操作系统所属家族(如 ‘windows’)–>    
     <family>Windows</family>    
     <!–激活profile的操作系统体系结构 –>    
     <arch>x86</arch>    
     <!–激活profile的操作系统版本–>    
     <version>5.1.2600</version>    
    </os>    
    <!–如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活。如果值    
    字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段–>    
    <property>    
     <!–激活profile的属性的名称–>    
     <name>mavenVersion</name>    
     <!–激活profile的属性的值–>    
     <value>2.0.3</value>    
    </property>    
    <!–提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活    
    profile。另一方面,exists则会检查文件是否存在,如果存在则激活profile。–>    
    <file>    
     <!–如果指定的文件存在,则激活profile。–>    
     <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>    
     <!–如果指定的文件不存在,则激活profile。–>    
     <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>    
    </file>    
   </activation>    
   <!–构建项目所需要的信息。参见build元素–>    
   <build>    
    <defaultGoal/>    
    <resources>    
     <resource>    
      <targetPath/><filtering/><directory/><includes/><excludes/>    
     </resource>    
    </resources>    
    <testResources>    
     <testResource>    
      <targetPath/><filtering/><directory/><includes/><excludes/>    
     </testResource>    
    </testResources>    
    <directory/><finalName/><filters/>    
    <pluginManagement>    
     <plugins>    
      <!–参见build/pluginManagement/plugins/plugin元素–>    
      <plugin>    
       <groupId/><artifactId/><version/><extensions/>    
       <executions>    
        <execution>    
         <id/><phase/><goals/><inherited/><configuration/>    
        </execution>    
       </executions>    
       <dependencies>    
        <!–参见dependencies/dependency元素–>    
        <dependency>    
         ……    
        </dependency>    
       </dependencies>    
       <goals/><inherited/><configuration/>    
      </plugin>    
     </plugins>    
    </pluginManagement>    
    <plugins>    
     <!–参见build/pluginManagement/plugins/plugin元素–>    
     <plugin>    
      <groupId/><artifactId/><version/><extensions/>    
      <executions>    
       <execution>    
        <id/><phase/><goals/><inherited/><configuration/>    
       </execution>    
      </executions>    
      <dependencies>    
       <!–参见dependencies/dependency元素–>    
       <dependency>    
        ……    
       </dependency>    
      </dependencies>    
      <goals/><inherited/><configuration/>    
     </plugin>    
    </plugins>    
   </build>    
   <!–模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径–>    
   <modules/>    
   <!–发现依赖和扩展的远程仓库列表。–>    
   <repositories>    
    <!–参见repositories/repository元素–>    
    <repository>    
     <releases>    
      <enabled/><updatePolicy/><checksumPolicy/>    
     </releases>    
     <snapshots>    
      <enabled/><updatePolicy/><checksumPolicy/>    
     </snapshots>    
     <id/><name/><url/><layout/>    
    </repository>    
   </repositories>    
   <!–发现插件的远程仓库列表,这些插件用于构建和报表–>    
   <pluginRepositories>    
    <!–包含需要连接到远程插件仓库的信息.参见repositories/repository元素–>        
    <pluginRepository>    
     <releases>    
      <enabled/><updatePolicy/><checksumPolicy/>    
     </releases>    
     <snapshots>    
      <enabled/><updatePolicy/><checksumPolicy/>    
     </snapshots>    
     <id/><name/><url/><layout/>    
    </pluginRepository>    
   </pluginRepositories>    
   <!–该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。–>    
   <dependencies>    
    <!–参见dependencies/dependency元素–>    
    <dependency>    
     ……    
    </dependency>    
   </dependencies>    
   <!–不赞成使用. 现在Maven忽略该元素.–>    
   <reports/>       
   <!–该元素包括使用报表插件产生报表的规范。当用户执行“mvn site”,这些报表就会运行。 在页面导航栏能看到所有报表的链接。参见reporting元素–>    
   <reporting>    
    ……    
   </reporting>    
   <!–参见dependencyManagement元素–>    
   <dependencyManagement>    
    <dependencies>    
     <!–参见dependencies/dependency元素–>    
     <dependency>    
      ……    
     </dependency>    
    </dependencies>    
   </dependencyManagement>    
   <!–参见distributionManagement元素–>    
   <distributionManagement>    
    ……    
   </distributionManagement>    
   <!–参见properties元素–>    
   <properties/>    
  </profile>    
 </profiles>    
 <!–模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径–>    
 <modules/>    
    <!–发现依赖和扩展的远程仓库列表。–>     
    <repositories>     
     <!–包含需要连接到远程仓库的信息–>    
        <repository>    
         <!–如何处理远程仓库里发布版本的下载–>    
         <releases>    
          <!–true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 –>    
    <enabled/>    
    <!–该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。–>    
    <updatePolicy/>    
    <!–当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。–>    
    <checksumPolicy/>    
   </releases>    
   <!– 如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的 策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 –>    
   <snapshots>    
    <enabled/><updatePolicy/><checksumPolicy/>    
   </snapshots>    
   <!–远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库–>    
   <id>banseon-repository-proxy</id>     
   <!–远程仓库名称–>    
            <name>banseon-repository-proxy</name>     
            <!–远程仓库URL,按protocol://hostname/path形式–>    
            <url>http://192.168.1.169:9999/repository/</url>     
            <!– 用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然 而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。–>    
            <layout>default</layout>               
        </repository>     
    </repositories>    
    <!–发现插件的远程仓库列表,这些插件用于构建和报表–>    
    <pluginRepositories>    
     <!–包含需要连接到远程插件仓库的信息.参见repositories/repository元素–>    
  <pluginRepository>    
   ……    
  </pluginRepository>    
 </pluginRepositories>    
       
    <!–该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。–>     
    <dependencies>     
        <dependency>    
   <!–依赖的group ID–>    
            <groupId>org.apache.maven</groupId>     
            <!–依赖的artifact ID–>    
            <artifactId>maven-artifact</artifactId>     
            <!–依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。–>    
            <version>3.8.1</version>     
            <!– 依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应, 尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在 plugin里定义新的类型。所以前面的类型的例子不完整。–>    
            <type>jar</type>    
            <!– 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成 JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。–>    
            <classifier></classifier>    
            <!–依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。    
                – compile :默认范围,用于编译      
                – provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath      
                – runtime: 在执行时需要使用      
                – test:    用于test任务时使用      
                – system: 需要外在提供相应的元素。通过systemPath来取得      
                – systemPath: 仅用于范围为system。提供相应的路径      
                – optional:   当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用–>     
            <scope>test</scope>       
            <!–仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。–>    
            <systemPath></systemPath>     
            <!–当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题–>    
            <exclusions>    
             <exclusion>     
                    <artifactId>spring-core</artifactId>     
                    <groupId>org.springframework</groupId>     
                </exclusion>     
            </exclusions>       
            <!–可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。–>     
            <optional>true</optional>    
        </dependency>    
    </dependencies>    
    <!–不赞成使用. 现在Maven忽略该元素.–>    
    <reports></reports>    
    <!–该元素描述使用报表插件产生报表的规范。当用户执行“mvn site”,这些报表就会运行。 在页面导航栏能看到所有报表的链接。–>    
 <reporting>    
  <!–true,则,网站不包括默认的报表。这包括“项目信息”菜单中的报表。–>    
  <excludeDefaults/>    
  <!–所有产生的报表存放到哪里。默认值是${project.build.directory}/site。–>    
  <outputDirectory/>    
  <!–使用的报表插件和他们的配置。–>    
  <plugins>    
   <!–plugin元素包含描述报表插件需要的信息–>    
   <plugin>    
    <!–报表插件在仓库里的group ID–>    
    <groupId/>    
    <!–报表插件在仓库里的artifact ID–>    
    <artifactId/>    
    <!–被使用的报表插件的版本(或版本范围)–>    
    <version/>    
    <!–任何配置是否被传播到子项目–>    
    <inherited/>    
    <!–报表插件的配置–>    
    <configuration/>    
    <!–一组报表的多重规范,每个规范可能有不同的配置。一个规范(报表集)对应一个执行目标 。例如,有1,2,3,4,5,6,7,8,9个报表。1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标–>    
    <reportSets>    
     <!–表示报表的一个集合,以及产生该集合的配置–>    
     <reportSet>    
      <!–报表集合的唯一标识符,POM继承时用到–>    
      <id/>    
      <!–产生报表集合时,被使用的报表的配置–>    
      <configuration/>    
      <!–配置是否被继承到子POMs–>    
      <inherited/>    
      <!–这个集合里使用到哪些报表–>    
      <reports/>    
     </reportSet>    
    </reportSets>    
   </plugin>    
  </plugins>    
 </reporting>    
 <!– 继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和 artifact ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里的依赖信息。–>    
 <dependencyManagement>    
  <dependencies>    
   <!–参见dependencies/dependency元素–>    
   <dependency>    
    ……    
   </dependency>    
  </dependencies>    
 </dependencyManagement>       
    <!–项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。–>     
    <distributionManagement>    
        <!–部署项目产生的构件到远程仓库需要的信息–>    
        <repository>    
         <!–是分配给快照一个唯一的版本号(由时间戳和构建流水号)?还是每次都使用相同的版本号?参见repositories/repository元素–>    
   <uniqueVersion/>    
   <id>banseon-maven2</id>     
   <name>banseon maven2</name>     
            <url>file://${basedir}/target/deploy</url>     
            <layout/>    
  </repository>    
  <!–构件的快照部署到哪里?如果没有配置该元素,默认部署到repository元素配置的仓库,参见distributionManagement/repository元素–>     
  <snapshotRepository>    
   <uniqueVersion/>    
   <id>banseon-maven2</id>    
            <name>Banseon-maven2 Snapshot Repository</name>    
            <url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url>     
   <layout/>    
  </snapshotRepository>    
  <!–部署项目的网站需要的信息–>     
        <site>    
         <!–部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置–>     
            <id>banseon-site</id>     
            <!–部署位置的名称–>    
            <name>business api website</name>     
            <!–部署位置的URL,按protocol://hostname/path形式–>    
            <url>     
                scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web      
            </url>     
        </site>    
  <!–项目下载页面的URL。如果没有该元素,用户应该参考主页。使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。–>    
  <downloadUrl/>    
  <!–如果构件有了新的group ID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。–>    
  <relocation>    
   <!–构件新的group ID–>    
   <groupId/>    
   <!–构件新的artifact ID–>    
   <artifactId/>    
   <!–构件新的版本号–>    
   <version/>    
   <!–显示给用户的,关于移动的额外信息,例如原因。–>    
   <message/>    
  </relocation>    
  <!– 给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。有效的值有:none(默认),converted(仓库管理员从 Maven 1 POM转换过来),partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部 署),verified(被核实时正确的和最终的)。–>    
  <status/>           
    </distributionManagement>    
    <!–以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里activation元素的说明)。格式是<name>value</name>。–>    
    <properties/>    
</project>

使用nvm利器,管理node版本(转)

 Nodejs  使用nvm利器,管理node版本(转)已关闭评论
5月 242018
 

node.js越来越热,应用的场景也越来越多。

但也因为是开源软件,所以具备大多数开源软件都存在的“版本问题”,版本发展很快,版本前后差异性大,老系统用新版本node跑不过,全局安装的第三方组件和node版本相关造成全局版本混乱。



nvm是解决这一问题的利器。

nvmnode版本管理工具,主要特点:

1.可安装多版本的node

2.灵活切换当前的node版本。

3.以沙箱方式全局安装第三方组件到对应版本的node中。

4.通过.vnmrc文件,方便灵活地指定各应用系统所需的node版本进行运行。

可惜目前只支持linuxOS系统。

接下来,就见证一下它的能力。 

 

安装nvm

通过下面的命令可进行一步到位的安装,下面两种方式可二选一。

curl
-o-
https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh |
bash

或者:

wget
-qO-
https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh |
bash

 

安装完后,验证安装

command
-v nvm

默认会在“/home/个人账户”目录下会生成.nvm的隐藏目录,所有的node会以沙箱的方式装到该目录下。

安装完成。

 

详细可参考官方:https://github.com/creationix/nvm 

 

安装多版本node

在命令行中运行命令,安装当前最新的稳定版。

nvm
install stable

当前最新的稳定版是6.3.0

 

运行命令,指明版本,安装早期的版本0.12.4

nvm
install 0.12.4

  

安装后,当前使用的node版本默认为最后一次安装的版本,在命令行中运行命令可查看当前版本。

nvm
current

 

切换node版本

运行命令切换。

nvm
use 6

 

显示所有安装的版本

运行命令,列出所有版本。

nvm
ls

 

左边有箭头的代表当前使用中的版本。

 

安装全局组件 

nvm管理的情况下,全局组件是安装到/usr/local/lib/node_modules下,然后通过软连接的方式把包中bin目录下的可执行文件链接到/usr/local/bin。不管用什么版本都装到这些目录下,多版本就没法玩了。

nvm管理下,以沙箱的方式,全局组件会装到.nvm目录的当前版本node下,也就是装在nvm这个沙箱里,跟在指定版本的node下,当前有什么版本的node,就有对应的全局组件。这是nvm强大的地方,在多运行环境的管理和切换极为好用。

下面,运行命令在当前6.3.0node版本下以全局的方式安装express生成器。

npm
install -g express-generator

express
-V

可以清楚的看到express生成器被安装到了当前版本的node目录下。

express默认用的是最新的版本,这里是4.13.4

 

现在,切换到0.12.4版本 

nvm
use 0

然后,全局安装express生成器3.0版。

npm
install -g express-generator@3

也可以清楚的看到express生成器装到了0.12.4node目录下,装完后express版本是3.0.0

可以再将node版本切换到6,那么当前的express版本又会切换成对应的版本。

很方便,很强大。

 

使用.nvmrc文件运行

在服务器上很多时候会运行多个应用系统,每个应用系统使用的node版本是不一样的,老系统用0.12.x甚至0.10.x,新系统用了新特新所以用最新的node版本,都很实际很正常。 

为了让不同的应用系统使用各自所需的node版本运行,我们只需在各应用系统内的根目录里生成一个.nvmrc文件,在其内写一个版本号,利用nvm
run <
系统启动文件>的方式运行系统,即可完成要求。

做个实验。

建个demo的文件夹,在其下写一个app1.js文件,其内容为:

console.log(process.versions);

只有一行代码,把当前运行的node版本输出到控制台。

 

app1.js同级,写一个.nvmrc文件,其中的版本号写“0”,目的是要在0.12.4版本下运行,可以用命令:

echo
'0' > .nvmrc

 

我们将当前的node版本切至6,然后运行:

nvm
use 6
nvm
run app1.js

运行效果: