自动推送微信公共账号群消息

微信公众平台的基础接口没有推送群消息的api(高级接口貌似也没有),所以用python写了个程序模拟微信公众平台的post请求来实现这个功能,附带实现了发送消息给单个用户。

需要的模块

requests:给人用的HTTP请求模块,python自带的urllib和urllib2实在是难用。requests支持会话模式,意思就是所有的请求都用一个实例,共享同一个cookies,十分方便。具体参考官方文档(中文):http://cn.python-requests.org/zh_CN/latest/index.html

实现

requests.seesion()就是会话模式

首先设置主请求头

然后login()函数登录,获取token。发送的密码用md5加密

最后masssend()函数发送群消息

singlesend()函数用来给单人发送消息,形参tofakeid不是用户的微信号,并且和api中”FromUserName 发送方帐号”也不一样,这样就没办法将用户直接关联起来,只能手动观察绑定-。-

ps:如果在本机浏览器上登录了微信公众平台,然后在另一个电脑上运行脚本,可能会导致脚本登录失败,解决的办法是退出本机登录。

自动化日常巡检程序-Python实现

程序说明

程序是通过使用python实现ssh连接到服务器去实行shell脚本,返回数据,并且生成excel,对不正常指标进行标红处理。

Python要实现ssh连接服务器还需要其他模块。

python-2.7.5、paramiko-1.15.2、xlwt-1.0.0

程序流程

daily check

由于这边是在windows下面执行的,下面我将改成在linux系统下面执行

程序结构与程序说明

此程序由主程序、主机信息文件、命令文件三个文件组成。

` daily_check.py <此文件是python的主程序
` 日期ycq.txt <生成的巡检信息文件
` check.log <日志文件
| hosts <存放着要执行那些命令和检查那些主机的文件
|     ` host.info <存放着需要巡检的主机IP和用户名密码
|     `xx.xx.xx.xx.sh<–脚本文件生成下面的文件
|     ` xx.xx.xx.xx.cmd <存放相关主机需要执行的命令
执行了daily_check.py生成了xunjian.txt文件,我们需要将文件的内容都拷贝到一个excel文件中查看。

并标出相关的预警的信息。如下:

daily check上图显示了5列:

  • 项目:检查了什么。
  • 命令:检查使用的命令。
  • 基线:比对的标准。
  • 巡检情况:检查出来的信息。
  • 主机:是在那台主机上检查的。
    • *.cmd文件

    此文件存放了巡检需要执行的命令、校验标准和命令是检查什么项目的,如下图:

    daily check
  • 以上文件的每一行分为3个部分:
    • 校验项目。
    • 校验shell命令。
    • 校验标准:校验标准指定一个操作符号(>、<、=),具体用途例如:<85% 如果检查出来的结果 >85%就超标了。

    以上三个部分是使用 “#” 分割(注意:请在命令中避免使用 “#”,以免出现程序分割错误)。

    host.info文件

    此文件中存放了需要巡检的主机的IP和用户名信息,它们使用空格分开,如果有不需要巡检的主机可以在里面使用 (#) 在注释,和shell脚本的注释是一样的。如图:

    daily check

如果有行的服务器需要巡检,需要添加相关 主机 信息到此文件中。

执行巡检先要执行xx.xx.xx.xx.sh脚本,生产xx.xx.xx.xx.cmd,然后再执行主程序daliy_check.py,现将脚本贴到下面:
1.主程序:daliy_check.py
#!/bin/env python
# -*- coding:utf-8 -*-

# program: ssh remote execute command
#          genaral data story local
# author: ycq
# date: 2017-08-18

import sys
import paramiko
import xlwt
import time
from datetime import datetime
import logging

logging.basicConfig(level=logging.INFO,
format=’%(asctime)s %(name)-12s %(levelname)-8s %(message)s’,
filename=’check.log’,
filemode=’w’,
datefmt=’%Y-%m-%d %X’)
reload(sys)
ISOTIMEFORMAT=’%Y-%m-%d’
sys.setdefaultencoding(‘utf-8’)

def header(work_sheet):
work_sheet.write(0, 0, ‘检查项目’, style0)
work_sheet.write(0, 1, ‘命令’, style0)
work_sheet.write(0, 2, ‘基准’, style0)
work_sheet.write(0, 3, ‘检查结果’, style0)
work_sheet.write(0, 4, ‘检查主机’, style0)
logging.info(‘header add ok!’)
return work_sheet

def run_host_sh(host, port, username, password, work_sheet):
ssh = paramiko.SSHClient()
command_file = open(‘./hosts/’ + host + ‘.cmd’, ‘r’)

for line in command_file.readlines():
rows = len(work_sheet.rows)
line = line.strip(‘\n’)
items = line.split(‘:’)

check_type = items[0].decode(‘utf-8’).encode(‘utf-8’)
check_cmd = items[1].decode(‘gbk’).encode(‘utf-8’)
check_base_line = items[2].decode(‘gbk’).encode(‘utf-8’)
opration = check_base_line[0:1]
base_value = check_base_line[1:]

work_sheet.write(rows, 0, check_type)
work_sheet.write(rows, 1, check_cmd)
work_sheet.write(rows, 2, check_base_line)

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(host, port, username, password, key_filename=None, timeout=2)
except Exception, e:
logging.error(‘can not connect host: ‘ + host)
logging.error(‘command can not exec: ‘ + check_cmd)
logging.error(e)
continue
stdin, stdout, stderr = ssh.exec_command(check_cmd)
return_info = stdout.read().strip()

style_red = xlwt.easyxf(‘pattern: pattern solid, fore_colour red;’ +
‘font: name Times New Roman, color-index black, bold on;’ +
‘borders: left thick, right thick, top thick, bottom thick;’ +
‘align: horiz center’)

error_flag = False

if opration == ‘>’:
if str(base_value) > str(return_info):
error_flag = True
elif opration == ‘=’:
if str(return_info) != str(base_value):
error_flag = True
elif opration == ‘<‘:
if str(base_value) < str(return_info):
error_flag = True

if error_flag:
logging.warning(host + ‘ checked diff’)
logging.warning(‘command is: ‘ + check_cmd)
work_sheet.write(rows, 3, return_info.decode(‘gbk’).encode(‘utf-8’), style_red)
else:
work_sheet.write(rows, 3, return_info.decode(‘gbk’).encode(‘utf-8’))

work_sheet.write(rows, 4, ‘server IP: ‘ + host)

check_info = check_type + ‘\t’ + check_cmd + ‘\t’ + check_base_line + ‘\t’ + return_info
check_info = check_info.strip(‘\n’)
check_info += ‘\t’ + ‘server IP: ‘ + host
logging.info(check_info)
command_file.close()
ssh.close()
return work_sheet

if __name__==’__main__’:
#   try:
#     main()
#   except Exception,e:
#     print e

style0 = xlwt.easyxf(‘pattern: pattern solid, fore_colour yellow;’ +
‘font: name Times New Roman, color-index black, bold on;’ +
‘borders: left thick, right thick, top thick, bottom thick;’ +
‘align: horiz center’,
num_format_str=’0,000.00′)

work_book = xlwt.Workbook(encoding=’utf-8′)
work_sheet = work_book.add_sheet(‘A Test Sheet’)
work_sheet = header(work_sheet)

hosts_file = open(‘./hosts/host.info’, ‘r’)

for line in hosts_file.readlines():
if line[0:1] == ‘#’: continue
line = line.strip(‘\n’)
items = line.split()
port = 22
host = items[0]
username = items[1]
password = items[2]

work_sheet = run_host_sh(host, port, username, password, work_sheet)
logging.info(host + ‘ check finish !\n’)
file_pre = time.strftime(ISOTIMEFORMAT, time.localtime(time.time()))
work_book.save(file_pre + ‘_ycq.xls’)

2.host.info
xx.xx.xx.xx user passwd
3.xx.xx.xx.xx.sh
#!/bin/bash
disk=$(df -lP | grep -e ‘/alidata1$’ | awk ‘{print $5}’)
echo -e 磁盘空间:$disk:”<85%” > 10.14.12.20.cmd
used_free=$(free -m | sed -n ‘2p’ | awk ‘{printf(“%d%\n”,$3/$2*100)}’)
echo -e 已使用内存:$used_free:”<10%” >> 10.14.12.20.cmd

检查IP是否存活

#!/bin/bash
IP=10.14.12
NODE=1
while [ “$NODE” -lt “255” ];
do
echo -en “Pinging ${IP}.${NODE}…”
ping -c1 -w1 -t5 ${IP}.${NODE} >/dev/null 2>&1
if [ “$?” -eq “0” ];then
echo “ok”
else
echo “failed”
fi
let NODE=$NODE+1
done

nginx日志按天截取

编写cut_nginx_log.sh脚本,脚本如下:

#!/bin/bash
logs_path=/app/lb/tengine-2.1.1/logs
yesterday=$(date -d “yesterday” +%Y-%m-%d)
mv ${logs_path}/access.log ${logs_path}/access_${yesterday}.log
mv ${logs_path}/error.log ${logs_path}/error_${yesterday}.log
kill -USR1 $(cat $logs_path/nginx.pid)

 

写好脚本之后,增加crontab定时任务,每天的00:00做日志切割

0 0 * * * /bin/bash /app/lb/tengine-2.1.1/cut_nginx_log.sh

curl与wget高级用法

curl(文件传输工具)

常用参数如下:

使用示例:
例1:抓取页面到指定文件,如果有乱码可以使用iconv转码

例2:模拟浏览器头(user-agent)

例3:处理重定向页面

例4:模拟用户登陆,保存cookie信息到cookies.txt文件,再使用cookie登陆

例5:获取HTTP响应头headers

例6:访问HTTP认证页面

例7:通过ftp上传和下载文件

wget(文件下载工具)

常用参数如下:

使用示例:
例1:下载单个文件到当前目录下,也可以-P指定下载目录

例2:对于网络不稳定的用户可以使用-c和–tries参数,保证下载完成

例3:下载大的文件时,我们可以放到后台去下载,这时会生成wget-log文件来保存下载进度

例4:可以利用—spider参数判断网址是否有效

例5:自动从多个链接下载文件

例6:限制下载速度

例7:登陆ftp下载文件

 

Nexus安装、使用说明、问题总结

1 . 私服简介

  私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。

                                      

我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache ArchivaArtifactorySonatype Nexus。这里我们使用 Sonatype Nexus。

2 . 安装Nexus

2 . 1 . 下载Nexus

  Nexus 专业版是需要付费的,这里我们下载开源版 Nexus OSS。Nexus 提供两种安装包,一种是包含 Jetty 容器的 bundle 包,另一种是不包含容器的 war 包。下载地址:http://www.sonatype.org/nexus/go

2 . 2 . 使用bundle安装包安装Nexus

解压安装包nexus-2.8.1-bundle.zip,打开命令提示符,进入/nexus-2.8.1-01目录,键入nexus命令(为方便启动和退出Nexus,可将bin目录添加到环境变量):

执行 nexus install 将Nexus安装为Windows服务。可将服务启动方式设为手动,以后通过 nexus start 即可启动Nexus ,通过 nexus stop 退出Nexus:

打开浏览器,访问:http://localhost:8081/nexus/:

点击右上角 Log In,使用用户名:admin ,密码:admin123 登录,可使用更多功能:

3 . Nexus预置的仓库

点击左侧 Repositories 链接,查看 Nexus 内置的仓库:

 

Nexus 的仓库分为这么几类:

  • hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)以及自己或第三方的项目构件;
  • proxy 代理仓库:代理公共的远程仓库;
  • virtual 虚拟仓库:用于适配 Maven 1;
  • group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。

4 . 添加代理仓库

以 Sonatype 为例,添加一个代理仓库,用于代理 Sonatype 的公共远程仓库。点击菜单 Add – Proxy Repository :

填写Repository ID – sonatype;Repository Name – Sonatype Repository;

Remote Storage Location – http://repository.sonatype.org/content/groups/public/ ,save 保存:

将添加的 Sonatype 代理仓库加入 Public Repositories 仓库组。选中 Public Repositories,在 Configuration 选项卡中,将 Sonatype Repository 从右侧 Available Repositories 移到左侧 Ordered Group Repositories,save 保存:

5 . 搜索构件

为了更好的使用 Nexus 的搜索,我们可以设置所有 proxy 仓库的 Download Remote Indexes 为 true,即允许下载远程仓库索引。

索引下载成功之后,在 Browse Index 选项卡下,可以浏览到所有已被索引的构件信息,包括坐标、格式、Maven 依赖的 xml 代码:

有了索引,我们就可以搜索了:

6 . 配置Maven使用私服

私服搭建成功,我们就可以配置 Maven 使用私服,以后下载构件、部署构件,都通过私服来管理。

在 settings.xml 文件中,为所有仓库配置一个镜像仓库,镜像仓库的地址即私服的地址(这儿我们使用私服公共仓库组 Public Repositories 的地址):

复制代码
复制代码
    <mirrors>
            <mirror>
                <id>central</id>
                <mirrorOf>*</mirrorOf> <!-- * 表示让所有仓库使用该镜像--> 
                <name>central-mirror</name> 
                <url>http://localhost:8081/nexus/content/groups/public/</url>
            </mirror> 
    </mirrors>
复制代码
复制代码

 

PS1:私有maven仓库Nexus使用http与https协议

Http协议:没有问题

Https协议:

Could not GET 'https://some_server.com/some/path/some.pom'.
     > peer not authenticated 解决:

If you get any other error like this:

 Could not GET 'https://some_server.com/some/path/some.pom'.
     > peer not authenticated

Then you need to import a certificate:

keytool -import -alias <the short name of the server> -file <cert_file_name_you_exported.cer> -keystore cacerts -storepass changeit

It will prompt you to import the certificate, type yes and press enter.

Then restart your eclipse and try building the project.

摘自——http://www.cnblogs.com/bingyeh/p/5913486.html

 

为什么我的ansible copy模块非常慢?!

最近用ansible来做一些初始化的操作,其中有用到copy模块来拷贝一些东西,结果发现速度慢到哭,经网络监测,2G的带宽它才给我跑了10MB,百度依旧是没有好答案,只能谷歌,第一条stack overflow就给出解决方案(这里吐槽下某朝最近的严打活动。。。,没有了谷歌我们怎么活)

原文如下:

I’m using Ansible to copy a directory (900 files, 136MBytes) from one host to another:

---
- name: copy a directory
  copy: src={{some_directory}} dest={{remote_directory}}

This operation takes an incredible 17 minutes, while a simple scp -r <src> <dest> takes a mere 7 seconds.

I have tried the Accelerated mode, which according to the ansible docs “can be anywhere from 2-6x faster than SSH with ControlPersist enabled, and 10x faster than paramiko.”, but to no avail.

答案:

TLDR:

use synchronize instead of copy.

use synchronize instead of copy.

use synchronize instead of copy.

重要的事情说三遍!!!

Here’s the copy command I’m using:

- copy: src=testdata dest=/tmp/testdata/

As a guess, I assume the sync operations are slow. The files module documentation implies this too:

The “copy” module recursively copy facility does not scale to lots (>hundreds) of files. For alternative, see synchronize module, which is a wrapper around rsync.

Digging into the source shows each file is processed with SHA1. That’s implemented using hashlib.sha1. A local test implies that only takes 10 seconds for 900 files (that happen to take 400mb of space).

So, the next avenue. The copy is handled with module_utils/basic.py’s atomic_move method. I’m not sure if accelerated mode helps (it’s a mostly-deprecated feature), but I tried pipelining, putting this in a local ansible.cfg:

[ssh_connection]
pipelining=True

It didn’t appear to help; my sample took 24 minutes to run . There’s obviously a loop that checks a file, uploads it, fixes permissions, then starts on the next file. That’s a lot of commands, even if the ssh connection is left open. Reading between the lines it makes a little bit of sense- the “file transfer” can’t be done in pipelining, I think.

So, following the hint to use the synchronize command:

- synchronize: src=testdata dest=/tmp/testdata/

That took 18 seconds, even with pipeline=False. Clearly, the synchronize command is the way to go in this case.

Keep in mind synchronize uses rsync, which defaults to mod-time and file size. If you want or need checksumming, add checksum=True to the command. Even with checksumming enabled the time didn’t really change- still 15-18 seconds. I verified the checksum option was on by running ansible-playbook with -vvvv, that can be seen here:

ok: [testhost] => {"changed": false, "cmd": "rsync --delay-updates -FF --compress --checksum --archive --rsh 'ssh  -o StrictHostKeyChecking=no' --out-format='<<CHANGED>>%i %n%L' \"testdata\" \"user@testhost:/tmp/testdata/\"", "msg": "", "rc": 0, "stdout_lines": []}

E文不好的我给翻一下:

其实就是用synchronize替代copy模块,另外,在ansible.cfg文件中改如下:

[ssh_connection]
pipelining=False

然后去感受替换后的奇迹吧,骚年~

ansible 使用root用户批量修改非root用户密码

目录

一 环境

  1. 系统环境
  2. 软件版本

二  批量修改用户密码

1. hosts 文件配置

2. 修改密码的yml

正文

一 环境

  1. 系统环境
  2. 软件版本

二批量修改用户密码

  1. host 文件配置

1.1 hosts 文件

 

[sudozone]
root@192.168.2.2

1.3 changpassword.yml  –修改密码的playbook

- name: changepasswd 
  hosts: onlystablesudo 
  sudo: yes
  vars:
    change_user: username 被修改密码的用户
    passwd: $1$zYZGbfAM$7aUvB/8EGbQhKaZuBMhV90 (此处必须使用加密的密码)
  tasks:
    - name: changepasswod 
      user: name={{ change_user }} password={{ passwd }} update_password=always

1.3.1  生成加密的密码

openssl passwd  -1 “12321421421”

2. 实施

ansible-playbook changpassword.yml

Maven常用插件使用说明之deploy

Maven的deploy插件用于把Maven自动构建生成的版本发布到中央代理仓库如Nexus服务器上,也能把第三方依赖库(如Jar包)或一个独立的Jar包直接发布到中央代理仓库供大家共享使用。下面介绍deploy插件的具体用法。假设Nexus服务器已成功安装,Nexus控制台URL为http://199.3.5.164:8081/nexus。

1、自动构建并发布到Nexus服务器(假设发布仓库为releases)

1)修改工程POM文件,增加以下内容:



releases
Internal Releases
http://199.3.5.164:8081/nexus/content/repositories/releases

其中url对应Nexus服务器的Releases仓库路径,repository的id必须与第3)点中的server的id一致。用于发布的仓库必须为Hosted类型。

2)修改Nexus服务器的Releases仓库属性。

进入Nexus控制台,用admin登录。点开“Views/Repositories”选“Repositories”,在Repositories列表中选择Releases,点configuration,Deployment Policy默认为“Disable Redeploy”,点击修改为“Allow Redeploy”并保存。

3)修改用户目录下的settings.xml文件。

settings.xml文件路径为${user.home}/.m2或%{m2_home}/conf/。Windows7系统目录为C:\Users\用户名\.m2。

找到,然后修改信息如下:


releases
deployment deployment

注意:server的id必须和第1)点中的repository的id一致。用户名最好用deployment。

4)重新设定用户deployment的密码。

进入Nexus控制台,点开Security选Users,在用户列表中右键点击deployment用户,选Set Password重新设定deployment的密码为“deployment”,当然也可设置为其他,只要与第3)点server配置一致即可。

5)在工程主目录下(POM文件所在目录)运行“mvn deploy:deploy”即能实现版本的构建和发布。

2、发布第三方依赖库或独立Jar包(假设发布仓库为releases,发布Jar包为test.jar)

1)按第1点中的第2)、3)、4)点进行配置。然后进入到test.jar所在目录。

2)执行“mvn deploy:deploy-file -DgroupId=com.test -DartifactId=test -Dversion=1.0 -Dpackaging=jar -Dfile=test.jar -Durl=http://199.3.5.164:8081/nexus/content/repositories/releases -DrepositoryId=releases”即可。

说明:deploy:deploy-file表示发布独立的文件。

groupId、artifactId和version可根据需要设定。

url为Nexus服务器releases仓库路径。

repositoryId与第1点第3)点中的server的id必须一致。

3)顺便说一下,发布独立的Jar包也可在Nexus控制台中实现。在Repositories列表中选择Releases,点Artifact Upload,指定GAV Definition为“GAV Parameters”,然后输入相应的groupId、artifactId和version、Packaging,再点击“Select Artifact(s) to Upload…”选择指定的Jar文件,最后点“Upload Artifact(s)”即可。

使用nexus搭建maven私服

使用maven的好处就是可以对项目的各种依赖进行统一管理,在pom文件中定以好依赖,就可以从maven中央库或者第三方库中下载到本地。但在企业内部使用也会遇到一些问题,每个使用者都需要去下载相应的依赖包或者插件,效率低下,所以搭建企业内部的私服就很有必要。

搭建私服后,所有的依赖就可以从私服下载,私服会自动判定,如果私服库里没有这个资源,则私服会自动去网上下载,如果私服已经包含所需资源,则可以通过内网提供给使用者,大大提高工作效率。

nexus是maven常用的私服,安装使用都还算方便,用于搭建企业内部的maven私服。

安装nexus

1、下载

下 载地址:http://nexus.sonatype.org/downloads/,这里列出了所有版本,挑一个最新版本来使用。Nexus提供了两种 安装方式,一种是内嵌Jetty的bundle,只要你有JRE就能直接运行。第二种方式是WAR,你只须简单的将其发布到web容器中即可使用。

为了方便就直接选用bundle版本。本文下载的是nexus-oss-webapp-1.9.2.3-bundle.tar.gz 。

2、安装

在指定的目录解压下载的文件

tar xvf nexus-oss-webapp-1.9.2.3-bundle.tar.gz

解 压后会看到两个文件夹,分别是nexus-oss-webapp-1.9.2.3和sonatype-work,前者包含了nexus的运行环境和应用程 序,后者包含了你自己的配置和存储构件的地方。nexus-oss-webapp-1.9.2.3/conf/plexus.properties中可以 修改端口信息已经工作区的路径。

3、启动nexus

进 入nexus-oss-webapp-1.9.2.3/bin/jsw/目录,然后根据OS的版本进入相应的目录,在linux下,运行./nexus start即启动了服务,直接运行./nexus会看到提示信息。neuxs默认监听端口是8081,此时在浏览器中运行访问http://nexus- server-ip:8081/nexus应该可以看到neuxs的界面。

4.配置nexus开启自动启动

以centos为例:

cp /opt/nexus/nexus-2.0.3/bin/nexus /etc/init.d/

打开/etc/init.d/nexus 修改

# Set this to the root of the Nexus installation
NEXUS_HOME=”/opt/nexus/nexus-2.0.3″

chkconfig nexus on   即可

如果是ubuntu

复制过去后运行:update-rc.d nexus defaults

注意配置防火墙规则:

-A INPUT -m state –state NEW -m tcp -p tcp –dport 8081 -j ACCEPT

配置nexus

开启远程索引

新搭建的neuxs环境只是一个空的仓库,需要手动和远程中心库进行同步,nexus默认是关闭远程索引下载,最重要的一件事情就是开启远程索引下载。登陆nexus系统,默认用户名密码为admin/admin123。

点击左边Administration菜单下面的Repositories,找到右边仓库列表中的三个仓库Apache Snapshots,Codehaus Snapshots和Maven Central,然后再没有仓库的configuration下把Download Remote Indexes修改为true。然后在这三个仓库上分别右键,选择Repari Index,这样Nexus就会去下载远程的索引文件。

建立内部仓库

新 建公司的内部仓库,步骤为Repositories –> Add –> Hosted Repository,在页面的下半部分输入框中填入Repository ID和Repository Name即可,比如分别填入myrepo和 my repository,另外把Deployment Policy设置为Allow Redeploy,点击save就创建完成了。

修改neuxs仓库组

Nexus 中仓库组的概念是Maven没有的,在Maven看来,不管你是hosted也好,proxy也好,或者group也好,对我都是一样的,我只管根据 groupId,artifactId,version等信息向你要构件。为了方便Maven的配置,Nexus能够将多个仓库,hosted或者 proxy合并成一个group,这样,Maven只需要依赖于一个group,便能使用所有该group包含的仓库的内容。

neuxs- 1.9.2.3中默认自带了一个名为“Public Repositories”组,点击该组可以对他保护的仓库进行调整,把刚才建立的公司内部仓库加入其中,这样就不需要再在maven中明确指定内部仓库 的地址了。同时创建一个Group ID为public-snapshots、Group Name为Public Snapshots Repositories的组,把Apache Snapshots、Codehaus Snapshots和Snapshots加入其中。

到这里neuxs的安装配置就完成了,下面介绍如何在maven中使用自己的私服。

项目使用maven私服

配置从nexus私服下载构件

maven 安装好默认是没有配置仓库信息,此时maven都默认去远程的中心仓库下载所依赖的构件。既然使用了私服,就需要明确告诉maven去哪里下载构件,可以 在三个地方进行配置,分别是是maven的安装目录下的conf下的settings.xml文件,这个全局配置,再一个是在 userprofile/.m2目录下的settings.xml,如果不存在该文件,可以复制conf下settings.xml,这个是针对当前用户 的,还有一个是在pom.xml中指定,其只对该项目有效,三个文件的优先级是pom.xml大于.m2,.m2大于conf下。

settings.xml的配置如下:

在profiles段增加一个profile

  1. <profile>
  2.   <id>nexus</id>
  3.   <repositories>
  4.     <repository>
  5.         <id>nexus</id>
  6.         <name>local private nexus</name>
  7.         <url>http://192.168.1.68:8081/nexus/content/groups/public</url>
  8.         <releases><enabled>true</enabled></releases>
  9.         <snapshots><enabled>false</enabled></snapshots>
  10.     </repository>
  11.     <repository>
  12.         <id>nexus-snapshots</id>
  13.         <name>local private nexus</name>
  14.         <url>http://192.168.1.68:8081/nexus/content/groups/public-snapshots</url>
  15.         <releases><enabled>false</enabled></releases>
  16.         <snapshots><enabled>true</enabled></snapshots>
  17.     </repository>
  18.   </repositories>
  19.   <pluginRepositories>
  20.     <pluginRepository>
  21.         <id>nexus</id>
  22.         <name>local private nexus</name>
  23.         <url>http://192.168.1.68:8081/nexus/content/groups/public</url>
  24.         <releases><enabled>true</enabled></releases>
  25.         <snapshots><enabled>false</enabled></snapshots>
  26.     </pluginRepository>
  27.     <pluginRepository>
  28.         <id>nexus-snapshots</id>
  29.         <name>local private nexus</name>
  30.         <url>http://192.168.1.68:8081/nexus/content/groups/public-snapshots</url>
  31.         <releases><enabled>false</enabled></releases>
  32.         <snapshots><enabled>true</enabled></snapshots>
  33.     </pluginRepository>
  34.    </pluginRepositories>
  35. </profile>

上 述的id,name可以根据自己的喜好来定义,保证多个repository的id不重复即可,主要是url的配置,可以在nexus的 repositories列表中找到对应的url,就是repositories的Repository Path,刚才我们已经在neuxs中定于了仓库组,这里就取对应组的Repository Path信息即可。

另 外,仓库是两种主要构件的家。第一种构件被用作其它构件的依赖。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件。如果不配置 pluginRepositories,那么执行maven动作时,还是会看到去远程中心库下载需要的插件构件,所以这里一定要加上这个。

在settings.xml中指使配置了profile还不行,需要激活它,在activeProfiles段,增加如下配置:

<activeProfile>nexus</activeProfile>

此处activeProfile中的内容就上面定义profile的id。

其实也可以不进行上述配置,只在项目的pom.xml里配置即可。配置如下
pom.xml配置如下:

  1. <repositories>
  2.       <repository>
  3.           <id>nexus</id>
  4.           <name>local private nexus</name>
  5.           <url>http://192.168.1.68:8081/nexus/content/groups/public</url>
  6.           <releases>
  7.               <enabled>true</enabled>
  8.           </releases>
  9.           <snapshots>
  10.               <enabled>false</enabled>
  11.           </snapshots>
  12.       </repository>
  13.   </repositories>
  14.   <pluginRepositories>
  15.       <pluginRepository>
  16.           <id>nexus</id>
  17.           <name>local private nexus</name>
  18.           <url>http://192.168.1.68:8081/nexus/content/groups/public</url>
  19.           <releases>
  20.               <enabled>true</enabled>
  21.           </releases>
  22.           <snapshots>
  23.               <enabled>false</enabled>
  24.           </snapshots>
  25.       </pluginRepository>
  26.   </pluginRepositories>

其中id,name都无所谓,关键不能把url弄错。

有了上述配置,当在项目执行maven操作时,如果本地库中没有依赖的构件,maven会去私服下载,如果私服也没有,私服会去远程中心库下载,同时会在私服的本地缓存,这样如果第二个人再要用到这个构件,私服就直接提供下载。

deploy项目到私服

对于企业自身的项目,也可以提交到搭建的nexus私服中,首先需要在项目的pom.xml中配置deploy到哪,配置如下:

  1. <distributionManagement>
  2. <repository>
  3. <id>releases</id>
  4. <name>Nexus Release Repository</name>
  5. <url>http://10.1.81.199:8081/nexus/content/repositories/releases/</url>
  6. </repository>
  7. <snapshotRepository>
  8. <id>snapshots</id>
  9. <name>Nexus Snapshot Repository</name>
  10. <url>http://10.1.81.199:8081/nexus/content/repositories/snapshots/</url>
  11. </snapshotRepository>
  12. </distributionManagement>

这是提交还是会报错,因为没有提交到nexus的权限

在maven的conf目录下,配置setting.xml

  1. <server>
  2.   <id>releases</id>
  3.   <username>admin</username>
  4.   <password>admin123</password>
  5. </server>
  6. lt;server>
  7. <id>snapshots</id>
  8. <username>admin</username>
  9. <password>admin123</password>
  10. </server>

注意这里的id应该和pom中配置的远程发布管理库的ID所对应才行。用户名和密码都是nexus的。再次deploy即可。

发布的项目带源码发布到nexus

需要配置插件来实现,在pom.xml中增加如下插件
  1. <plugin>
  2.             <groupId>org.apache.maven.plugins</groupId>
  3.             <artifactId>maven-source-plugin</artifactId>
  4.             <executions>
  5.                 <execution>
  6.                     <id>attach-sources</id>
  7.                     <goals>
  8.                         <goal>jar</goal>
  9.                     </goals>
  10.                 </execution>
  11.             </executions>
  12.         </plugin>

deploy时候不进行test

由于我deploy时候,自动进行test,而我的test需要的环境可能已经没有了导致无法deploy
于是可增加参数
deploy -Dmaven.test.skip=true
就可以跳过test环节。我是在eclipse中用的, run—build… 里输入这些就可以了

常见问题:

更新遇到错误:

was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced
去自己的.m2 文件夹下把 xxx.lastUpdated文件全部删掉,重新运行maven,ok!

或者在用maven时加 -U参数,就可以忽略xxx.lastUpdated..