转载地址:http://blog.youkuaiyun.com/fbysss/article/details/43311961
blog:blog.youkuaiyun.com/fbysss
声明:本文由fbysss原创,转载请注明出处
一、.maven安装
下载maven:http://maven.apache.org/download.cgi
tar zxvf apache-maven-3.2.5-bin.tar.gz
mv apache-maven-3.2.5 /usr/local/
vi /etc/profile
文件末尾添加
export MAVEN_HOME=/usr/local/apache-maven-3.2.5
export PATH=$PATH:$MAVEN_HOME/bin
source /etc/profile
mvn就可以看到输出了。
回想Ant,对包是没有这样的管理的,全凭程序员自己把jar包放在一起,可能会出现:
1.版本冲突。因为包与包之间是相互引用的,到底哪个和哪个匹配需要弄准确了。比如spring-orm的3.2.3版本,引用了一个aopalliance1.0版本的包。
2.包遗漏或冗余。因为这些jar包都是散列的一个个文件存在与某个文件夹里面,没有一个归档说明,文件夹有任何变化,都没有记录和说明。
另外Maven的一个很大的好处,就是程序的发型包不需要附带一大堆能够在互联网上找到的jar包,而是可以直接通过pom文件从maven中央仓库中下载。这样就能使应用便携化。
二、maven私服Nexus安装
背景:安装Nexus私服,是为了避免maven总从远程中央仓库下载太慢(海外线路),可以在公司内部搭建一个私服,根据需要,再从中央仓库同步一些内容过来。
步骤:
下载nexus-2.11.1-01-bundle.tar.gz,然后运行bin下的nexus start
Starting Nexus OSS...
Failed to start Nexus OSS.
原因是sonatype-work文件夹归属不对。
这里面有一个readme也已经说明了,运行的时候也提示了,不建议用root运行。
所以,解压的时候,就不应该用root解压。用普通用户解压,
mkdir nexus-2.11.1-01-bundle
tar zxvf xxxxxx.gz -C nexus-2.11.1-01-bundle
要注意的是,8081后面还有一个后缀
访问地址如下:http://localhost:8081/nexus/
问题:
nexus central仓库右键,repaire index的时候,发现后台日志/sss/nexus-2.11.1-01-bundle/logs/wrapper.log中报错:
er - Trying to get remote index for repository"Central" [id=central]
jvm 2 | 2015-01-22 15:20:43,441+0800 INFO [pxpool-1-thread-2] admin org.sonatype.nexus.index.DefaultIndexerManager -Cannot incrementally update index for repository central
jvm 2 | 2015-01-22 15:20:43,442+0800 INFO [pxpool-1-thread-2] admin org.sonatype.nexus.index.DefaultIndexerManager -Unable to incrementally update index for repository central. Trying full indexupdate
jvm 2 | 2015-01-22 15:20:43,846+0800 INFO [pxpool-1-thread-2] admin org.sonatype.nexus.index.DefaultIndexerManager -Trying to get remote index for repository "Central" [id=central]
后来居然出现
jvm 2 | 2015-01-22 15:38:22,893+0800WARN [pxpool-1-thread-2] adminorg.sonatype.nexus.index.DefaultIndexerManager - Cannot fetch remote index forrepository "Central" [id=central] due to IO problem.
jvm 2 | java.net.SocketTimeoutException: Read timed out
实际上是因为虚拟机没有vpn,网速很慢。
解决:用代理软件ccproxy在主机进行代理。
然后在nexus的administration中可以进行设置,设置http和https的代理
三、配置Maven自动部署到Tomcat
tomcat有一个maven插件,可以直接控制部署到tomcat:
http://tomcat.apache.org/maven-plugin-trunk/index.html
首先,在Parent Pom里面的plugins节点,增加一段:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
增加configuration:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8080/manager/html</url>
<server>tomcat</server>
</configuration>
</plugin>
然后在$MAVEN_HOME/conf/settings.xml中,增加一个server
<server>
<id>tomcat</id>
<username>admin</username>
<password>admin</password>
</server>
mvn help:describe -Dplugin=tomcat7 可以查看相关操作
mvn tomcat7:deploy
ERROR] No plugin found for prefix 'tomcat7'in the current project and in the plugin groups
查了一下,tomcat的插件已经在私服和本地库都有了,感觉没啥错误,所以估计是插件刚刚下载下来。
那么,再执行一遍,出现新的错误了:
[ERROR] Failed to execute goalorg.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) onproject sssApp: Cannot invoke Tomcat manager: Connection reset -> [Help 1]
需要进行相应配置
当然,
vi $CATALINA_HOME/conf/tomcat-users.xml
增加:
<rolerolename="manager-gui"/>
<user username="admin" password="admin"roles="manager-gui"/>
</tomcat-users>
——注意:新版tomcat在权限控制方面有改动,根据版本不同而定。
结果还是出现上次的信息。
后来发现,curl http://localhost:8080根本不行,而curl http://192.168.0.12:8080就可以。更换了地址,可以了。(见后面的解决办法)
但是出现
[ERROR] Failed to execute goalorg.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) onproject sssApp: Tomcat return http status error: 413, Reason Phrase: RequestEntity Too Large:
解决:
server {
listen 80;
server_name appserver.fbysss.com;
location /{
index index.html index.htmindex.jsp;
proxy_set_headerX-Forwarded-For $remote_addr;
proxy_pass http://192.168.0.12:8080;
client_max_body_size 500M;
}
}
nginx -s reload
然而,现在报错:
[ERROR] Failed to execute goalorg.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) onproject s: Cannot invoke Tomcat manager: Premature end of Content-Lengthdelimited message body (expected: 961; received: 0 -> [Help 1]
这个信息,整个世界都很少。怎么办》?
mvn tomcat7:redeploy -X >deploy.log
tail -1000 deploy.log
发现真正的问题在这里:好恶心啊
[ERROR] Tomcat return http status error:401, Reason Phrase: Unauthorized
....
[ERROR] Failed to execute goalorg.apache.tomcat.maven:tomcat7-maven-plugin:2.2:redeploy (default-cli) onproject sssApp: Tomcat return http status error: 401, Reason Phrase:Unauthorized:
修改了
vi $CATALINA_HOME/conf/tomcat-users.xml
增加:
<rolerolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin"password="admin" roles="manager-gui,manager-script"/>
</tomcat-users>
并且修改
<configuration>
<url>http://appserver.fbysss.com/manager/text</url>
<server>tomcat</server>
</configuration>
结果又
Premature end of Content-Length delimitedmessage body
还是,看-X的信息发现:
[DEBUG] Authentication required
[DEBUG] appserver.fbysss.com:80 requested authentication
[DEBUG] Authorization challenge processed
[DEBUG] Authentication failed
[DEBUG] Clearing cached auth scheme for http://appserver.fbysss.com:80
[DEBUG] Connection 0.0.0.0:55653<->127.0.0.1:80 shut down
[DEBUG] Connection 0.0.0.0:55653<->127.0.0.1:80 closed
[DEBUG] Connection released: [id: 0][route: {}->http://appserver.fbysss.com][totalkept alive: 0; route allocated: 0 of 2; total allocated: 0 of 5]
修改地址为ip地址+8080
redeploy还是记住的上次的地址,不行。
deploy
[WARNING] Unrecognised tag: 'server' (position: START_TAGseen ...</servers>\n <server>... @39:11) @/usr/local/apache-maven-3.2.5/conf/settings.xml, line 39, column 11
一检查maven的settings.xml: o my god!
</servers>
<server>
<id>tomcat</id>
<username>admin</username>
<password>admin</password>
</server>
但reploy-only,还是记住的域名。
思考一下:这个设置在pom中,有一个旧的已经部署到local repository了。
于是直接修改repository中的pom文件。
vi~/.m2/repository/com/fbysss/sssApp-pom/1.0.0/sssApp-pom-1.0.0.pom
<configuration>
<url>http://192.168.0.12:8080/manager/text</url>
<server>tomcat</server>
</configuration>
改成地址,这回就可以了。
[INFO] Packaging webapp
[INFO] Assembling webapp [sssApp] in /repo/sssApp/target/sssApp]
[INFO] Processing war project
[INFO] Copying webapp resources [/repo/sssApp/src/main/webapp]
[INFO] Webapp assembled in [4636 msecs]
[INFO] Building war: /repo/sssApp/target/sssApp.war
可以看到其原理:就是把tar下的包拷贝到tomcat下面。
参考文章:http://www.disasterarea.co.uk/blog/deploying-to-tomcat-7-with-maven/
四、问题分析解决:
那么,还有两个问题值得考究:
curl: (52) Empty reply from server
1.为什么域名就不行?——是因为在普通用户下,用sudo curl就可以了。
2.为什么localhostcurl都不行?——原来也是需要sudo,但是用curl http://127.0.0.1:8080就是可以。
因此,遇到curl: (52) Empty reply from server,排查和办法如下:
1.用浏览器访问,看是否可以
2.尝试用curl http://本机ip地址,是否可以
3.尝试用curl http://127.0.0.1,是否可以
解决:如果上述方法可以,应该是权限问题。sudo,或者用root登录运行就可以了。
五、Maven小技巧:
mvn -f xxx.xml可以指定pom文件进行构建。
mvn -s /path/to/user/my-settings.xml 指定settings文件
mvn dependency:purge-local-repository 删除本地仓库
分析jar包依赖关系
mvn dependency:analyze
mvn dependency:tree
mvn install -U
删除未下载完毕的本地仓库文件,再次更新下载
mvn tomcat7:redeploy 重新部署Tomcat7
mvn -X 这个参数,用在疑难杂症上,当提示信息很怪异,想进一步排查时使用
mvn help:describe -Dplugin=【plugname,比如tomcat7】 可以查看插件的相关操作