Maven私服(二) – Nexus的安装
最后更新于:2022-04-01 20:45:31
Win7上面没有JDK7,我就只能先到Ubuntu上进行使用了
好了,在Ubuntu上安装了Nexus,解压后将其移动到了/opt目录下
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce65012f35c.jpg)
将原文件解压后,有2个文件夹,
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce6501483bb.jpg)
(
这里记录一个错误,之前只复制了一个nexus,没有复制sonatype-work,这导致了nexus服务无法启动,
网上说这个文件夹会自动生成,可能是权限的问题,导致他没有生成成功。
)
启动的话,进到bin目录
~~~
./nexus start
~~~
启动服务
~~~
./nexus status
~~~
服务状态
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce65015ac70.jpg)
启动成功后,就可以访问地址:http://localhost:8081/nexus/
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce650172edb.jpg)
然后我们可以使用管理员帐号登录看看:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce6501968f4.jpg)
右上角那里是可以登录的,我们使用 admin admin123来登录,这是默认的密码
登录后,左侧会有更多的功能
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce6501aa071.jpg)
';
Maven私服(一) – The nexus service was launched, but failed to start.
最后更新于:2022-04-01 20:45:29
今天想试一下Maven的私服,从网上下了个Nexus,安装,启动
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce6500bc3dc.jpg)
报错信息:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce6500d10b0.jpg)
看了下目录,应该有日志的,
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce6500e7d7d.jpg)
好吧,说什么版本不对
在网上找到了答案:
[http://blog.csdn.net/pk490525/article/details/14228423](http://blog.csdn.net/pk490525/article/details/14228423)
感谢分享
说是JDK的版本不对,我这里用的是JDK6,要使用JDK7才行,Nexus从2.6开始就不支持JDK6了。
还看到网上说直接指定下Java的地址也可以:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce650112af0.jpg)
本地没有JDK7就不尝试了。
';
Maven中引入本地jar包
最后更新于:2022-04-01 20:45:26
在实际开发中,我们可能会遇到有一些JAR包在Maven的公共仓库中没有,所以我们要在本地引入
这里也是刚刚尝试的,分享下
### 1. systemPath方式引入
参考网址:[http://www.cnblogs.com/richard-jing/archive/2013/01/27/Maven_localjar.html](http://www.cnblogs.com/richard-jing/archive/2013/01/27/Maven_localjar.html)
感谢分享
我们在引入依赖的时候,有一个作用域,可以配置为system
对于依赖可以参考下这篇博客:(哎,看了下,写的不太好,有时间,重写下)
[Maven深入学习(二)- 依赖 ](http://blog.csdn.net/yuguiyang1990/article/details/8866719)
示例:
~~~
org.postgresql
postgresql
9.3
system
${project.basedir}/lib/postgresql-9.3.jar
~~~
该jar包在项目中的位置:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce65005b21f.jpg)
上面参考的网址提醒:使用这种方式引入的JAR包在打包时不会一起打包,所以打包后找不到该JAR包
解决方法:
修改JAR包的位置,将JAR包放在resources目录下
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce650074ea4.jpg)
修改pom.xml
~~~
4.0.0
org.ygy
helloworld
0.0.1-SNAPSHOT
jar
helloworld
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
org.postgresql
postgresql
9.3
system
${project.basedir}/src/main/resources/lib/postgresql-9.3.jar
lib/
lib/
**/postgresql-9.3.jar
~~~
### 2. 将JAR包安装到本地仓库
官方介绍:[http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html](http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html)
执行命令:
~~~
D:\WorkSpace\cognos\helloworld\src\main\resources\lib>mvn install:install-file -
Dfile=postgresql-9.3.jar -DgroupId=org.postgresql -DartifactId=postgresql -Dvers
ion=9.3 -Dpackaging=jar
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce6500888bb.jpg)
执行该命令后,Maven会将该JAR包部署到本地仓库中,这样在Maven中就可以正常使用了
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce65009e592.jpg)
但是其他的话,也需要执行以下mvn install命令才可以正常使用
### 3. 将本地lib发布为仓库
使用repository标签,这个暂未成功,明天尝试下。
';
Maven常用命令-创建Web项目
最后更新于:2022-04-01 20:45:24
上一回,我们使用maven命令新建了Java项目,这回,我们新建个Web项目
命令:
~~~
yuguiyang@onepiece:~/Documents/maven_demo$ mvn archetype:generate \
> -DarchetypeArtifactId=maven-archetype-webapp \
> -DgroupId=org.ygy \
> -DartifactId=web_demo
~~~
这里比上次的Java项目多一个配置:
> -DarchetypeArtifactId=maven-archetype-webapp
这里指定了一个xx(怎么称呼忘记了,模板?)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce650026d70.jpg)
这里会生成Web项目需要的文件和目录
这里生成的web.xml是2.3的,会不会有点儿老
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce65003ffc2.jpg)
需要的话,目前先手动改一下,或者查一下资料看看。
';
Maven常用命令-创建Java项目
最后更新于:2022-04-01 20:45:22
我们之前使用Maven都是直接在Eclipse中创建的,有的时候步骤稍微冒犯些
这里我们学习下怎样用命令创建项目
参考网址:
[http://www.cnblogs.com/PatrickLee/archive/2012/10/31/2747398.html](http://www.cnblogs.com/PatrickLee/archive/2012/10/31/2747398.html)
感谢分享。
1. 创建Java项目
~~~
yuguiyang@onepiece:~/Documents/maven_demo$ mvn archetype:create \
> -DgroupId=org.ygy \
> -DartifactId=hello_maven
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64ffee92e.jpg)
首次运行命令时,maven会下载一些依赖的jar包
我们等待她运行完就可以了
~~~
yuguiyang@onepiece:~/Documents/maven_demo$ mvn archetype:create \
> -DgroupId=org.ygy \
> -DartifactId=hello_maven
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-archetype-plugin:2.2:create (default-cli) @ standalone-pom ---
[WARNING] This goal is deprecated. Please use mvn archetype:generate instead
[INFO] Defaulting package to group ID: org.ygy
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:RELEASE
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.ygy
[INFO] Parameter: packageName, Value: org.ygy
[INFO] Parameter: package, Value: org.ygy
[INFO] Parameter: artifactId, Value: hello_maven
[INFO] Parameter: basedir, Value: /home/yuguiyang/Documents/maven_demo
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /home/yuguiyang/Documents/maven_demo/hello_maven
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.439 s
[INFO] Finished at: 2014-10-13T10:01:41+08:00
[INFO] Final Memory: 13M/310M
[INFO] ------------------------------------------------------------------------
yuguiyang@onepiece:~/Documents/maven_demo$
~~~
等看到BUILD SUCCESS就可以了
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce65000ea2c.jpg)
(PS
在上面的日志中,我们看到一条警告
[WARNING] This goal is deprecated. Please use mvn archetype:generate instead
目测是说我们的命令中 mvn archetype:create \ 已经不推荐使用了,废弃掉了,使用 mvn archetype:generate 代替
我们试下
~~~
yuguiyang@onepiece:~/Documents/maven_demo$ mvn archetype:generate \
> -DgroupId=org.ygy \
> -DartifactId=new_code
~~~
这次执行时,又下载了一大堆jar包,中间还提示说要选择版本,直接Enter选择默认了
最后也是执行成功了的
以后我们还是使用官方推荐的命令吧
)
';
Ubuntu上安装Maven3
最后更新于:2022-04-01 20:45:20
好久没有用Java了,好久没有用Maven了,
今天想在Ubuntu上安装下Maven3
刚开始用apt-get 安装的,结果只有maven2,然后就卸载了
sudo apt-get remove maven2
然后在网上找了下教程,看看怎么安装
### 1. 下载压缩包
我们从官网上下载Maven3
将压缩包解压
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64ff7c83d.jpg)
解压后,将压缩包放到了 opt 目录下(在Linux中放在哪,没有什么理解,反正直接mv到opt去了)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64ff99f26.jpg)
### 2. 配置环境变量
在网上找到的,说要修改 /etc/profile
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64ffb9fa9.jpg)
--------------------
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64ffd48c3.jpg)
修改后,mvn命令就可以使用了
';
Maven最佳实践:版本管理
最后更新于:2022-04-01 20:45:17
找到了一篇博客,很多啊,是讲Maven中的版本管理的,很好,分享一下,
原文作者:juvenshun
原文地址:[http://juvenshun.iteye.com/blog/376422](http://juvenshun.iteye.com/blog/376422)
-------------------------------------------------------------------------------------
### 什么是版本管理
首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用法。版本管理中说得版本是指构件(artifact)的版本,而非源码的版本(如subversion中常见的rXXX,或者git中一次提交都有个sha1的commit号)。
比如我有一个项目,其artifactId为myapp,随着项目的进展,我们会生成这样一些jar:myapp-1.0-SNAPSHOT.jar,myapp-1.0.jar,myapp-1.1-SNAPSHOT.jar,
myapp-1.0.1.jar等等。你可能会说,这很简单啊,我在POM中改个version,mvn clean install不就完了?但这只是表面,本文我将讲述,snapshot和release版本的区别,如何自动化版本发布(如果你的项目有几十个module,你就会觉得手工改POM来升级版本是很痛苦的事情),结合自动化发布的过程,这里还会介绍maven-release-plugin。此外,一些scm概念也会被涉及到,比如tag和branch。
### 前提:版本控制
不管怎样,我们都需要建立一个项目并提交到SCM中,这里我以subversion为例。你得有一个配置好的subversion repository,这里我建立了一个空的svn仓库,其地址
为:https://192.168.1.100:8443/svn/myapp/ 现在,该目录下只有三个空的典型的子目录:/trunk/, branches/, tags/。分别用来存放主干,分支,以及标签。
接着将项目导入到svn仓库中,到项目根目录,运行如下命令:
~~~
svn import -m 'project initialization' https://192.168.1.100:8443/svn/myapp/trunk
~~~
(注意,这么做你会将目录下所有文件导入到svn库中,但是这其中某些目录和文件是不应该被导入的,如/target目录,以及eclipse相关的项目文件)
目前,我们将项目的版本设置为1.0-SNAPSHOT。
### 为什么用SNAPSHOT?
我先说说如果没有SNAPSHOT会是什么样子。假设你的项目有2个模块,A,B,其中A依赖B。这三个模块分别由甲,乙两个个人负责开发。在开发过程中,因为A是依赖于B
的,因此乙每次做一个改动都会影响到甲,于是,乙提交了一些更改后,需要让甲看到。这个时候,怎么做呢?乙对甲说,“你签出我的代码,build一下就OK了”,甲有点不情
愿,但还是照做了,签出代码,svn clean install,然后,发现build出错了,有个测试没有pass。甲郁闷了,对乙说,“你的代码根本不能用,我不想build,你build好了给我”,
乙看了看确实自己的代码build不过,于是回去解决了,然后打了个jar包,扔给甲,甲对了对groupId,artifactId,放到了自己的.m2/repository/目录下,OK,能用了。
于是乙每次更新都这样做,打包,复制,然后甲粘贴,使用……渐渐的,大家发现这是个很笨的办法,这是纯手工劳动阿,程序员最BS的就是重复劳动。一天,甲对乙说,“你知道nexus么?你把你的jar发布到nexus上就可以了,我要用就自动去下载,这多棒!”乙说“哦?有这好东西,我去看看”于是乙发现了nexus这块新大陆,并成功的发布了B到nexus上。(见,[Nexus入门指南,(图文)](http://juvenshun.iteye.com/blog/349534))。
但是,请注意,我们这里的一切都假设没有SNAPSHOT,因此如果乙不更改版本,甲下载一次如B-1.0.jar之后,maven认为它已经有了正确的B的版本,就不会再重新下载。甲发现了这个问题,对乙说“你的更新我看不到,你更新了么?”乙说“不可能!我看看”,于是检查一下甲下载的C-1.0.jar,发现那是几天前的。乙一拍脑袋,说“这简单,我更新一下我的版本就好了,我发布个B-1.1.jar上去,你更新下依赖版本”,甲照做了,似乎这么做是可行的。
这里有一个问题,一次提交就更新一个版本,这明显不是正确的管理办法,此外,乙得不停的通知甲更新对B的依赖版本,累不累阿?1.0,或者说1.1,2.0,都代表了稳定,这样随随便便的改版本,能稳定么?
所以Maven有SNAPSHOT版本的概念,它与release版本对应,后者是指1.0,1.1,2.0这样稳定的发布版本。
现在乙可以将B的版本设置成1.0-SNAPSHOT,每次更改后,都mvn deploy到nexus中,每次deploy,maven都会将SNAPSHOT改成一个当前时间的timestamp,比如B-1.0-
SNAPSHOT.jar到nexus中后,会成为这个样子:B-1.0-20081017-020325-13.jar。Maven在处理A中对于B的SNAPSHOT依赖时,会根据这样的timestamp下载最新的jar,默
认Maven每天更新一次,如果你想让Maven强制更新,可以使用-U参数,如:
~~~
mvn clean install -U
~~~
现在事情简化成了这个样子:乙做更改,然后mvn deploy,甲用最简单的maven命令就能得到最新的B。
### 从1.0-SNAPSHOT到1.0到1.1-SNAPSHOT
SNAPSHOT是快照的意思,项目到一个阶段后,就需要发布一个正式的版本(release版本)。一次正式的发布需要这样一些工作:
1. 在trunk中,更新pom版本从1.0-SNAPSHOT到1.0
1. 对1.0打一个svn tag
1. 针对tag进行mvn deploy,发布正式版本
1. 更新trunk从1.0到1.1-SNAPSHOT
你可以手工一步步的做这些事情,无非就是一些svn操作,一些pom编辑,还有一些mvn操作。但是你应该明白,手工做这些事情,一来繁琐,而来容易出错。因此这里我介绍使用maven插件来自动化这一系列动作。
### SCM
首先我们需要在POM中加入scm信息,这样Maven才能够替你完成svn操作,这里我的配置如下:
~~~
scm:svn:http://192.168.1.100:8443/svn/myapp/trunk/
scm:svn:https://192.168.1.100:8443/svn/myapp/trunk/
~~~
需要注意的是,很多windows使用的tortoiseSVN客户端,而没有svn命令行客户端,这会导致Maven所有svn相关的工作失败,因此,你首先确保svn --version能够运行。
#### 分发仓库
想要让Maven帮我们自动发布,首先我们需要配置好分发仓库。关于这一点,见[Maven最佳实践:Maven仓库](http://juvenshun.iteye.com/blog/359256)——分发构件至远程仓库。
#### maven-release-plugin
紧接着,我们需要配置maven-release-plugin,这个插件会帮助我们升级pom版本,提交,打tag,然后再升级版本,再提交,等等。基本配置如下:
~~~
org.apache.maven.plugins
maven-release-plugin
2.0-beta-7
https://192.168.1.100:8443/svn/myapp/tags/
~~~
GAV我就不多解释了,这里我们需要注意的是configuration元素下的tagBase元素,它代表了我们svn中的tag目录,也就是说,maven-release-plugin帮我们打tag的时候,其基础目录是什么。这里,我填写了svn仓库中的标准的tags目录。
#### 提交代码
接着,确保你的所有代码都提交了,如果你有未提交代码,release插件会报错,既然你要发布版本了,就表示代码是稳定的,所以要么要么把代码提交了,要么把本地的更改抛弃了。
#### 开始工作
现在,屏住呼吸,执行:
~~~
mvn release:prepare
~~~
执行过程中,你会遇到这样的提示:
*What is the release version for "Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT"? (org.myorg:myapp) 1.0: :*
——“你想将1.0-SNAPSHOT发布为什么版本?默认是1.0。”我要的就是1.0,直接回车。
*What is SCM release tag or label for "Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT"? (org.myorg:myapp) myapp-1.0: :*
——“发布的tag标签名称是什么?默认为myapp-1.0。”我还是要默认值,直接回车。
*What is the new development version for "Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT"? (org.myorg:myapp) 1.1-SNAPSHOT: :*
——“主干上新的版本是什么?默认为1.1-SNAPSHOT。”哈,release插件会自动帮我更新版本到1.1-SNAPSHOT,很好,直接回车。
然后屏幕刷阿刷,maven在build我们的项目,并进行了一些svn操作,你可以仔细查看下日志。
那么结果是什么呢?你可以浏览下svn仓库:
- 我们多了一个tag:https://192.168.1.100:8443/svn/myapp/tags/myapp-1.0/,这就是需要发布的版本1.0。
- 再看看trunk中的POM,其版本自动升级成了1.1-SNAPSHOT。
这不正是我们想要的么?等等,好像缺了点什么,对了,1.0还没有发布到仓库中呢。
再一次屏住呼吸,执行:
~~~
mvn release:perform
~~~
maven-release-plugin会自动帮我们签出刚才打的tag,然后打包,分发到远程Maven仓库中,至此,整个版本的升级,打标签,发布等工作全部完成。我们可以在远程Maven
仓库中看到正式发布的1.0版本。
这可是自动化的 ,正式的 版本发布!
### Maven的版本规则
前面我们提到了SNAPSHOT和Release版本的区别,现在看一下,为什么要有1.0,1.1,1.1.1这样的版本,这里的规则是什么。
Maven主要是这样定义版本规则的:
~~~
<主版本>.<次版本>.<增量版本>
~~~
比如说1.2.3,主版本是1,次版本是2,增量版本是3。
主版本一般来说代表了项目的重大的架构变更,比如说Maven 1和Maven 2,在架构上已经两样了,将来的Maven 3和Maven 2也会有很大的变化。次版本一般代表了一些功能的
增加或变化,但没有架构的变化,比如说Nexus 1.3较之于Nexus 1.2来说,增加了一系列新的或者改进的功能(仓库镜像支持,改进的仓库管理界面等等),但从大的架构上
来说,1.3和1.2没什么区别。至于增量版本,一般是一些小的bug fix,不会有重大的功能变化。
一般来说,在我们发布一次重要的版本之后,随之会开发新的版本,比如说,myapp-1.1发布之后,就着手开发myapp-1.2了。由于myapp-1.2有新的主要功能的添加和变化,
在发布测试前,它会变得不稳定,而myapp-1.1是一个比较稳定的版本,现在的问题是,我们在myapp-1.1中发现了一些bug(当然在1.2中也存在),为了能够在段时间内修复
bug并仍然发布稳定的版本,我们就会用到分支(branch),我们基于1.1开启一个分支1.1.1,在这个分支中修复bug,并快速发布。这既保证了版本的稳定,也能够使bug得到
快速修复,也不同停止1.2的开发。只是,每次修复分支1.1.1中的bug后,需要merge代码到1.2(主干)中。
上面讲的就是我们为什么要用增量版本。
### 实战分支
目前我们trunk的版本是1.1-SNAPSHOT,其实按照前面解释的版本规则,应该是1.1.0-SNAPSHOT。
现在我们想要发布1.1.0,然后将主干升级为1.2.0-SNAPSHOT,同时开启一个1.1.x的分支,用来修复1.1.0中的bug。
首先,在发布1.1.0之前,我们创建1.1.x分支,运行如下命令:
~~~
mvn release:branch -DbranchName=1.1.x -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false
~~~
这是maven-release-plugin的branch目标,我们指定branch的名称为1.1.x,表示这里会有版本1.1.1, 1.1.2等等。updateBranchVersions=true的意思是在分支中更新版本,而
updateWorkingCopyVersions=false是指不更改当前工作目录(这里是trunk)的版本。
在运行该命令后,我们会遇到这样的提示:
*What is the branch version for "Unnamed - org.myorg:myapp:jar:1.1-SNAPSHOT"? (org.myorg:myapp) 1.1-SNAPSHOT: :*
——"分支中的版本号是多少?默认为1.1-SNAPSHOT" 这时我们想要的版本是1.1.1-SNAPSHOT,因此输入1.1.1-SNAPSHOT,回车,maven继续执行直至结束。
接着,我们浏览svn仓库,会看到这样的目录:https://192.168.1.100:8443/svn/myapp/branches/1.1.x/,打开其中的POM文件,其版本已经是1.1.1-SNAPSHOT。
分支创建好了,就可以使用release:prepare和release:perform为1.1.0打标签,升级trunk至1.2.0-SNAPSHOT,然后分发1.1.0。
至此,一切OK。
### 小结
本文讲述了如何使用Maven结合svn进行版本管理。解释了Maven中SNAPSHOT版本的来由,以及Maven管理版本的规则。并结合SCM的tag和branch概念展示了如何使用
maven-release-plugin发布版本,以及创建分支。本文涉及的内容比较多,且略显复杂,不过掌握版本管理的技巧对于项目的正规化管理来说十分重要。Maven为我们提供了一
些一套比较成熟的机制,值得掌握。
';
Maven知识点记录 – repositories
最后更新于:2022-04-01 20:45:15
在使用Maven时,有的jar包可以只在某一个仓库中有,而且只想在这个项目中使用,可以使用repositories来配置
~~~
nexus
Team Nexus Repository
http://localhost:8081/nexus/content/groups/public
offical
Maven Official Repository
http://repo1.maven.org/maven2
false
......
~~~
即在该项目可以使用这个仓库中的JAR包,
在开发时,如果公司有私服,可能会这样使用
';
Maven知识点记录 – profile
最后更新于:2022-04-01 20:45:13
在实际开发过程中,开发环境,测试环境和最后部署上线的环境都是不一样的,像数据库连接,都是要变的。
如果不使用Maven的话,我想到的就是修改配置文件,手动的修改;
使用Maven的话,就简单的多了。
先来看一个pom文件:
~~~
4.0.0
org.ygy
maven
war
0.0.1-SNAPSHOT
maven Maven Webapp
http://maven.apache.org
UTF-8
devlopment
lufei
shishi
src/main/resources
true
true
test
http://www.deppon.com
haha
can you
src/main/resources
true
false
junit
junit
4.10
test
org.springframework
spring-core
3.1.1.RELEASE
org.springframework
spring-beans
3.1.1.RELEASE
org.springframework
spring-context
3.1.1.RELEASE
org.springframework
spring-jdbc
3.1.1.RELEASE
maven
~~~
其中,有些标签可能没有用过,就是,
Profile 的作用是允许你在项目文件(pom.xml)里定义若干个 profile 段,然后在编译时选择其中的一个用于覆盖项目文件原先的定义。
~~~
devlopment
lufei
shishi
src/main/resources
true
true
~~~
我们大体上可以看懂,下面简单介绍一下具体的用法:
1.activation 激活方式
1)根据环境自动激活:如可以根据JDK版本,OS,Maven属性来激活
~~~
dev
false
1.5
Windows XP
Windows
x86
5.1.2600
mavenVersion
2.0.5
file2.properties
file1.properties
...
~~~
2)通过命令行激活
这是最直接和最简单的方式,比如你定义了一个名为 myProfile 的 profile,你只需要在命令行输入 mvn clean install -P myprofile 就能将其激活,
这种方式的好处很明显,但是有一个很大的弊端,当 profile 比较多的时候,在命令行输入这写 -P 参数会让人觉得厌烦,
所以,如果你一直用这种方式,觉得厌烦了,可以考虑使用其它自动激活的方式。
3)配置默认自动激活
~~~
dev
true
...
~~~
4)配置 settings.xml 文件 profile 激活
settings.xml 文件可以在 ~/.m2 目录下,为某个用户的自定义行为服务,也可以在 M2_HOME/conf 目录下,为整台机器的所有用户服务。
而前者的配置会覆盖后者。同理,由 settings.xml 激活的 profile 意在为用户或者整个机器提供特定环境配置,
比如,你可以在某台机器上配置一个指向本地数据库 URL 的 profile,然后使用该机器的 settings.xml 激活它。激活方式如下:
~~~
...
local_db
~~~
(注:参考博客 [激活Maven profile的几种方式](http://juvenshun.iteye.com/blog/208714))
2.filtering功能
这里的意思是,过滤src/main/resources下的文件
~~~
src/main/resources
true
~~~
Filtering 是 Maven Resources Plugin 的一个功能,它会使用系统属性或者项目属性的值替换资源文件(*.properties,*.xml)当中 ${…} 符号的值。
比如你系统属性有一项 “user.name=foobar”,那么资源文件当中的 ${user.name} 符号会在 Maven 编译时自动被替换为 “foobar”。
(注:参考博客 [Apache Maven 使用 profile 和 filtering 实现多种环境下的资源](http://archboy.org/2012/05/21/apache-maven-profile-filtering-multiple-build-environments/))
Maven官方Filter讲解:[http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html](http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html)
3.说了这么多,下面来实践一下
这是我们的Maven项目:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fe9fc91.jpg)
一个是配置文件,一个是Spring的配置文件
demo.properties
~~~
hello ,${username}
jdbc.url = ${jdbc.url}
jdbc.username = ${jdbc.username}
jdbc.password = ${jdbc.password}
~~~
applicationContext.xml
~~~
~~~
pom.xml就是最上面提到的:
~~~
4.0.0
org.ygy
maven
war
0.0.1-SNAPSHOT
maven Maven Webapp
http://maven.apache.org
UTF-8
devlopment
lufei
shishi
src/main/resources
true
true
test
http://www.deppon.com
haha
can you
src/main/resources
true
false
junit
junit
4.10
test
org.springframework
spring-core
3.1.1.RELEASE
org.springframework
spring-beans
3.1.1.RELEASE
org.springframework
spring-context
3.1.1.RELEASE
org.springframework
spring-jdbc
3.1.1.RELEASE
maven
~~~
这里有2个profile,一个是development,一个是test,默认自动激活development
注意
~~~
lufei
shishi
~~~
~~~
索隆
gogo
http://www.deppon.com
haha
can you
~~~
这里的和就是我们在配置文件中使用的会变化的配置,Maven会自动将 ${}替换成profile中配置的。
接下来,我们进入到该项目的根目录下,执行Maven命令
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64feba9f3.jpg)
1.使用默认激活方式
~~~
mvn clean compile
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fed6f71.jpg)
进入target/classes目录
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64feefe6b.jpg)
打开demo.properties和applicationContext.xml文件
会发现,在development中指定的属性都已经成功替换
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64ff11090.jpg)
而demo.properties中,jdbc相关的并没有配置,所以没有替换
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64ff2836d.jpg)
2.使用命令更改激活方式
重新输入命令
~~~
mvn clean compile -P test
~~~
我们启用了test环境的配置方式
再次进入target/classes文件夹下查看,会发现不同的替换
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64ff40a8f.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64ff5684f.jpg)
好了,到这里就可以简单使用了。
';
Maven创建的Web项目无法使用EL表达式
最后更新于:2022-04-01 20:45:10
之前在使用Maven时,创建一个We项目,有时候会用到EL表达式 ${message},会发现无法识别,显示如下效果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fde1c37.jpg)
一直没有明白为什么,今天,偶然间知道了原因。
如果你也遇到这样的情况,来看一下你的web.xml文件:
~~~
Archetype Created Web Application
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
CharacterEncodingFilter
/*
helloworld
org.springframework.web.servlet.DispatcherServlet
1
helloworld
/
~~~
这是旧版本的web.xml格式,可以到Tomcat下找一个web.xml看一下区别:
旧版本的web.xml
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fe04683.jpg)
新版本的web.xml
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fe1d921.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fe363f5.jpg)
把上面几行标签复制一下:(改成UTF-8)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fe4dbde.jpg)
复制过去之后,重新启动项目,在访问一次那个界面:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fe64fdb.jpg)
好了,已经可以正常使用了,![大笑](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569e21abc5518.gif)
。
这里还有一个方法也可以解决,但是比较麻烦,就是在JSP页面上加上一行代码:(JSP2.0中支持EL表达式,老版本不支持)
~~~
<%@ page isELIgnored ="false" %>
~~~
Web容器默认isELIgnored="false"。
如果设定为真,那么JSP中的表达式被当成字符串处理。
大家可以试一下。
注意:
这里,还遇到一个问题,就是将web.xml修改之后,依然不能识别EL表达式,后来发现是配置出了问题:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fe82534.jpg)
注意这里的 Dynamic Web Module一定也要修改为2.5或者更高的版本
有这样一句话:当然工程的版本、jdk版本、tomcat版本、jar的版本缺一不可 (摘自其他博客)
';
Maven深入学习(四)- 知识总结
最后更新于:2022-04-01 20:45:08
### 1.dependencies与dependencyManagement
在以前的单独项目中,在配置项目中的依赖时,使用dependencies标签。
而在现在的多模块项目中,比如在继承中:
如果在父亲中配置了dependencies,那么孩子会继承父亲中配置的所有依赖
如:
~~~
junit
junit
3.8.1
test
~~~
在孩子中什么也不配置,也可以看到项目会引入junit的jar包。
那什么是dependencyManagement呢?
父亲的pom
~~~
4.0.0
org.ygy.mvc
parent
0.0.1-SNAPSHOT
pom
parent
http://maven.apache.org
UTF-8
org.apache.struts
struts2-core
2.3.1
junit
junit
3.8.1
test
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fdb3a93.jpg)
可以看到,父亲中,只引入了Junit一个依赖
在dependencyManagement标签中配置的依赖不会出现在自己或者孩子中,但是,会保持版本和scope与父亲一致。
孩子的pom
~~~
4.0.0
org.ygy.mvc
parent
0.0.1-SNAPSHOT
son
jar
son
http://maven.apache.org
org.apache.struts
struts2-core
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fdc80b6.jpg)
在 pom 中指明 dependency management 元素的方式 maven 结合项目继承来管理依赖。在多模块应用中,可能多个子项目会有共同的依赖。
此时为了正确运行,必须让所有的子项目使用依赖项的同一版本。
必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的成果。
因此,应在顶层的 pom 中定义共同的依赖关系。
';
Maven深入学习(三)- 聚合与继承
最后更新于:2022-04-01 20:45:06
### 1.聚合
在使用Maven的过程中,手边可能有很多个项目,都需要打包,或者同时进行一些操作,这时候,如果一个一个手动的去操作,
就会显得很麻烦。这时候,使用聚合就可以解决问题了。
假设,现在已有项目brother01,brother02,我们想要同时将这两个项目打包。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fd4c318.jpg)
其中,brother01和brother02是正常的项目,brother00是一个空的项目,它可以只有一个pom文件
~~~
4.0.0
org.ygy.mvc
brother00
0.0.1-SNAPSHOT
pom
brother00
http://maven.apache.org
UTF-8
../brother01
../brother02
~~~
注意:
1)packaging方式为pom
2)modules标签,将需要统一管理的项目引进来即可
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fd629c7.jpg)
聚合,就好像是将实体类放在entity下,将持久层发在dao下,放在一起统一管理。
### 2.继承
继承的概念很好理解,和Java中的意思一样。只不过,在Maven中继承的是pom。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fd78873.jpg)
parent的pom
~~~
4.0.0
org.ygy.mvc
parent
0.0.1-SNAPSHOT
pom
parent
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
~~~
son的pom
~~~
4.0.0
org.ygy.mvc
parent
0.0.1-SNAPSHOT
son
jar
son
http://maven.apache.org
~~~
注意:
1)父亲的pom同样要指定packaging为pom
可以继承的元素:
~~~
groupId :项目组 ID ,项目坐标的核心元素;
version :项目版本,项目坐标的核心元素;
description :项目的描述信息;
organization :项目的组织信息;
inceptionYear :项目的创始年份;
url :项目的 url 地址
develoers :项目的开发者信息;
contributors :项目的贡献者信息;
distributionManagerment :项目的部署信息;
issueManagement :缺陷跟踪系统信息;
ciManagement :项目的持续继承信息;
scm :项目的版本控制信息;
mailingListserv :项目的邮件列表信息;
properties :自定义的 Maven 属性;
dependencies :项目的依赖配置;
dependencyManagement :醒目的依赖管理配置;
repositories :项目的仓库配置;
build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
reporting :包括项目的报告输出目录配置、报告插件配置等。
~~~
### 3.聚合与继承的关系
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fd918a3.jpg)
区别与共同点摘自博客:[http://chenzhou123520.iteye.com/blog/1582166](http://chenzhou123520.iteye.com/blog/1582166)
聚合是为了协同项目构建
继承是为了消除重复
';
Maven深入学习(二)- 依赖
最后更新于:2022-04-01 20:45:04
从网上找到一份Maven3学习资料,是一份学习笔记,很不错,分享一下:[http://download.csdn.net/detail/jolingogo/5314305](http://download.csdn.net/detail/jolingogo/5314305)
### 1.依赖的配置
先来看一个pom.xml
~~~
4.0.0
com.deppon.demo
test01
war
0.0.1-SNAPSHOT
test01 Maven Webapp
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
javax.servlet
servlet-api
2.5
provided
test01
~~~
根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖
每个依赖包含的元素有:
groupId,artifactId,version:依赖的基本坐标
type:依赖的类型。大部分情况下,该元素不必声明,默认是jar
scope:依赖的范围
optional:标记依赖是否可选
exclusions:用来排除传递性依赖
### 2.scope (依赖范围)
在Maven的世界中,有很多种classpath,编译classpath,测试classpath,运行classpath
依赖范围就是用来控制依赖与这三种classpath的关系
compile:编译依赖范围。如果没有指定,则默认使用该依赖范围。使用此范围的依赖,在编译,测试,运行着三种classpath都有效。
test:测试依赖范围。使用此范围的依赖,只对测试classpath有效,即只有在测试的代码中才可用。典型例子就是Junit
provided:已提供依赖范围。使用此范围的依赖对于编译和测试都有效,但在运行时无效。典型例子就是servlet-api
runtime:运行时依赖范围。使用此范围的依赖对于测试和运行classpath有效,但在编译主代码是无效。典型例子就是JDBC驱动实现
system:系统依赖范围。对于编译和测试有效,但在运行时无效。使用system范围时,必须通过systemPath元素显示的指定依赖文件的路径(慎用)
import:导入依赖范围
';
Maven深入学习(一)- 坐标
最后更新于:2022-04-01 20:45:01
从这里开始的话,一边参照PDF文档《Maven实战》,一边整理一下自己的理解,和大家一起分享。
### 1.什么是Maven坐标
就像平面上的坐标一样,通过 x , y 可以唯一确定一个点。Maven的坐标可以唯一的标识一个Java构件,Maven世界中有各种的jar包,每一个jar包都有他自己的坐标。
那在Maven中怎样来标识一个坐标呢?也是x 和 y吗?
### 2.Maven坐标的元素
一共有5中元素:groupId,artifactId,version,packaging,classifier
示例:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fd285da.png)
groupId:定义当前Maven项目隶属的实际项目,表示方式与Java包名的表示方式类似,通常与域名反向一一对应。
artifactId:该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目的名称作为artifactId的前缀。
version:该元素定义Maven项目当前所处的版本
packaging :该元素定义Maven项目的打包方式,打包方式通常与所生成构件的文件扩展名对应
classifier:该元素用来帮助定义构建输出的一些附属构件
其中,groupId,artifactId,version 3个元素是必须定义的,packaging是可选的(默认为jar),而classifier是不能直接定义的。
';
(十) – 阶段小结
最后更新于:2022-04-01 20:44:59
嗯,上一篇“使用Maven构建SSH”,示例已经写好,最近没什么太多时间整理,所以博客的话,可能在周六日更新,先整理一下最近学习Maven的心得。
1.使用Maven来构建项目,的确挺方便,尤其是依赖管理,使用的各种依赖包,都可以通过配置文件来修改,而不是像以前一样,要把所有的包都拷贝到项目中,
这应该是约定由于配置吧![微笑](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-18_569ca449c5105.gif)
2.看看之前整理的博客,发现了一个问题,好像很多的博客都比较类似,其实,不管是Web项目,Struts2项目,SSH项目都是一样的原理,只是在Maven的资源库中找到依赖包的配置,然后向以往一样就可以了![委屈](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-25_56a5a367bba9a.gif)
,哎...之后的话,身边有一些Maven的资料,书籍,可能是一边看书,一边整理博客。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [Maven学习(一)- 环境搭建](http://blog.csdn.net/jolingogo/article/details/8775046)
- [Maven学习(二)- 安装m2eclipse插件 ](http://blog.csdn.net/jolingogo/article/details/8796410)
- [Maven学习(三)- 使用Maven构建Web项目](http://blog.csdn.net/jolingogo/article/details/8796726)
- [Maven学习(四)- 使用Maven构建Web项目-测试](http://blog.csdn.net/jolingogo/article/details/8797153)
- [Maven学习(五)- 使用Maven构建Struts2项目](http://blog.csdn.net/jolingogo/article/details/8798052)
- [Maven学习(六)- 构建Hibernate项目](http://blog.csdn.net/jolingogo/article/details/8798684)
- [Maven学习(七)- 构建Spring项目](http://blog.csdn.net/jolingogo/article/details/8799307)
- [Maven学习(八)- 构建MyBatis项目](http://blog.csdn.net/jolingogo/article/details/8801158)
- [Maven学习(九)- 构建SSH项目](http://blog.csdn.net/jolingogo/article/details/8811817)
- [Maven学习(十) - 阶段小结
](http://blog.csdn.net/jolingogo/article/details/8821375)
- [专栏:Maven学习之旅](http://blog.csdn.net/column/details/yuguiyang-maven.html)
';
(九)- 构建SSH项目
最后更新于:2022-04-01 20:44:57
在这里整合一下,使用Maven构建一个SSH项目
### 1.新建一个Web项目
可以参照前面的博客
### 2.添加依赖,修改pom.xml
~~~
4.0.0
com.deppon.demo
test06
war
0.0.1-SNAPSHOT
test06 Maven Webapp
http://maven.apache.org
UTF-8
junit
junit
4.10
test
org.apache.struts
struts2-core
2.3.1
org.apache.struts
struts2-spring-plugin
2.3.1
org.hibernate
hibernate-core
3.6.5.Final
commons-dbcp
commons-dbcp
1.4
log4j
log4j
1.2.16
org.slf4j
slf4j-api
1.6.1
org.slf4j
slf4j-nop
1.6.4
javassist
javassist
3.11.0.GA
org.springframework
spring-core
3.1.1.RELEASE
org.springframework
spring-beans
3.1.1.RELEASE
org.springframework
spring-context
3.1.1.RELEASE
org.springframework
spring-jdbc
3.1.1.RELEASE
org.springframework
spring-orm
3.1.1.RELEASE
org.springframework
spring-web
3.1.1.RELEASE
test06
~~~
3.各种配置文件,各种代码
这里的话,就不贴代码了,和使用MyEclipse开发Web项目是一样的,在后一篇博客中也提到了,其实,之前的好多博客都是一样的原理,都是修改依赖配置,其他没什么,
相关的项目应该就到这里了,以后的话,会根据一些资料系统的学习一下maven,整理出更好的博客来![大笑](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569e21abc5518.gif)
。
使用Maven构建SSH项目源码:[http://download.csdn.net/detail/jolingogo/5274494](http://download.csdn.net/detail/jolingogo/5274494)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [Maven学习(一)- 环境搭建](http://blog.csdn.net/jolingogo/article/details/8775046)
- [Maven学习(二)- 安装m2eclipse插件 ](http://blog.csdn.net/jolingogo/article/details/8796410)
- [Maven学习(三)- 使用Maven构建Web项目](http://blog.csdn.net/jolingogo/article/details/8796726)
- [Maven学习(四)- 使用Maven构建Web项目-测试](http://blog.csdn.net/jolingogo/article/details/8797153)
- [Maven学习(五)- 使用Maven构建Struts2项目](http://blog.csdn.net/jolingogo/article/details/8798052)
- [Maven学习(六)- 构建Hibernate项目](http://blog.csdn.net/jolingogo/article/details/8798684)
- [Maven学习(七)- 构建Spring项目](http://blog.csdn.net/jolingogo/article/details/8799307)
- [Maven学习(八)- 构建MyBatis项目](http://blog.csdn.net/jolingogo/article/details/8801158)
- [Maven学习(九)- 构建SSH项目](http://blog.csdn.net/jolingogo/article/details/8811817)
- [Maven学习(十) - 阶段小结
](http://blog.csdn.net/jolingogo/article/details/8821375)
- [专栏:Maven学习之旅](http://blog.csdn.net/column/details/yuguiyang-maven.html)
';
(八)- 构建MyBatis项目
最后更新于:2022-04-01 20:44:55
在这里,写一下,怎么使用Maven构建MyBatis项目。
### 1. 新建一个Web项目
可以参考前面的博客
### 2. 修改pom.xml,添加MyBatis依赖
~~~
4.0.0
com.deppon.demo
test05
war
0.0.1-SNAPSHOT
test05 Maven Webapp
http://maven.apache.org
UTF-8
junit
junit
4.10
test
org.mybatis
mybatis
3.1.1
log4j
log4j
1.2.16
org.slf4j
slf4j-api
1.6.1
org.slf4j
slf4j-nop
1.6.4
test05
~~~
### 3. 添加mybatis-config.xml
~~~
~~~
PersonEntityMapper.xml
~~~
insert into t_person(id , name) values(#{id} , #{name})
~~~
IPersonEntityDao.java
~~~
package com.deppon.test05.dao;
import java.util.List;
import com.deppon.test05.entity.PersonEntity;
public interface IPersonEntityDao {
/**
* 插入一条记录
* @param person
*/
public void insert(PersonEntity person);
/**
* 查询所有记录
* @return
*/
public List queryAll();
}
~~~
PersonEntityDao.java
~~~
package com.deppon.test05.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.deppon.test05.dao.IPersonEntityDao;
import com.deppon.test05.entity.PersonEntity;
import com.deppon.test05.util.MyBatisUtil;
public class PersonEntityDao implements IPersonEntityDao {
public static final String NAMESPACE = "com.deppon.test05.mapper.PersonEntityMapper";
@Override
public void insert(PersonEntity person) {
SqlSession session = MyBatisUtil.getSession();
session.insert(NAMESPACE + ".insert" , person);
session.commit();
session.close();
}
@Override
public List queryAll() {
SqlSession session = MyBatisUtil.getSession();
List personList = session.selectList(NAMESPACE + ".queryAll");
session.commit();
session.close();
return personList;
}
}
~~~
PersonEntity.java
~~~
package com.deppon.test05.entity;
public class PersonEntity implements java.io.Serializable {
private static final long serialVersionUID = -1138245964662330288L;
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "PersonEntity [id=" + id + ", name=" + name + "]";
}
}
~~~
MyBatisUtil.java
~~~
package com.deppon.test05.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private static SqlSessionFactory factory = null;
private static void initialFactory() {
String resource = "mybatis-config.xml";
try {
InputStream in = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
if(factory == null) {
initialFactory();
}
return factory.openSession();
}
}
~~~
测试程序:
~~~
package com.deppon.test05.dao;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.deppon.test05.dao.impl.PersonEntityDao;
import com.deppon.test05.entity.PersonEntity;
public class PersonEntityDaoTest {
private IPersonEntityDao personEntityDao;
@Before
public void before() {
personEntityDao = new PersonEntityDao();
}
@Test
public void testQueryAll() {
List personList = personEntityDao.queryAll();
for(PersonEntity each : personList) {
System.out.println(each);
}
}
@Test
public void testInsert() {
PersonEntity person = new PersonEntity();
person.setId(200);
person.setName("乔巴");
personEntityDao.insert(person);
}
}
~~~
项目结构如下图所示:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fcd9ec4.png)
注意:记得那两条命令哦,亲![大笑](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569e21abc5518.gif)
(前面的博客有)
结果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fd03b4b.png)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [Maven学习(一)- 环境搭建](http://blog.csdn.net/jolingogo/article/details/8775046)
- [Maven学习(二)- 安装m2eclipse插件 ](http://blog.csdn.net/jolingogo/article/details/8796410)
- [Maven学习(三)- 使用Maven构建Web项目](http://blog.csdn.net/jolingogo/article/details/8796726)
- [Maven学习(四)- 使用Maven构建Web项目-测试](http://blog.csdn.net/jolingogo/article/details/8797153)
- [Maven学习(五)- 使用Maven构建Struts2项目](http://blog.csdn.net/jolingogo/article/details/8798052)
- [Maven学习(六)- 构建Hibernate项目](http://blog.csdn.net/jolingogo/article/details/8798684)
- [Maven学习(七)- 构建Spring项目](http://blog.csdn.net/jolingogo/article/details/8799307)
- [Maven学习(八)- 构建MyBatis项目](http://blog.csdn.net/jolingogo/article/details/8801158)
- [Maven学习(九)- 构建SSH项目](http://blog.csdn.net/jolingogo/article/details/8811817)
- [Maven学习(十) - 阶段小结
](http://blog.csdn.net/jolingogo/article/details/8821375)
- [专栏:Maven学习之旅](http://blog.csdn.net/column/details/yuguiyang-maven.html)
';
(七)- 构建Spring项目
最后更新于:2022-04-01 20:44:52
在这里,使用Maven构建一个Spring项目,正在做练习,下午有事,可能要晚上回来接着写...![快哭了](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-14_575f8babbf599.gif)
构建单独项目的话,其实都差不多
### 1. 新建一个Web项目
参考之前的博客
### 2.修改 pom.xml,添加Spring依赖
~~~
4.0.0
com.deppon.demo
test04
war
0.0.1-SNAPSHOT
test04 Maven Webapp
http://maven.apache.org
UTF-8
junit
junit
4.10
test
org.springframework
spring-core
3.1.1.RELEASE
org.springframework
spring-beans
3.1.1.RELEASE
org.springframework
spring-context
3.1.1.RELEASE
org.springframework
spring-jdbc
3.1.1.RELEASE
test04
~~~
### 3.添加Spring配置文件,applicationContext.xml
~~~
~~~
IPersonDao.java
~~~
package com.deppon.test04.dao;
public interface IPersonDao {
public void save();
}
~~~
PersonDao.java
~~~
package com.deppon.test04.dao.impl;
import com.deppon.test04.dao.IPersonDao;
public class PersonDao implements IPersonDao {
@Override
public void save() {
System.out.println("------------from PersonDao.save()");
}
}
~~~
IPersonService.java
~~~
package com.deppon.test04.service;
public interface IPersonService {
public void processSave();
}
~~~
PersonService.java
~~~
package com.deppon.test04.service.impl;
import com.deppon.test04.dao.IPersonDao;
import com.deppon.test04.service.IPersonService;
public class PersonService implements IPersonService {
private IPersonDao personDao;
public void setPersonDao(IPersonDao personDao) {
this.personDao = personDao;
}
@Override
public void processSave() {
System.out.println("-------------from PersonService.processSave()");
personDao.save();
}
}
~~~
测试类:PersonServiceTest.java
~~~
package com.deppon.test04.service;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class PersonServiceTest {
private BeanFactory factory = null;
@Before
public void before() {
factory = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void testSpring() {
IPersonService personService = (IPersonService) factory.getBean("personService");
personService.processSave();
}
}
~~~
项目结构如下图所示:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fca7532.png)
注意:
在运行测试程序之前,还需要运行两个命令:(ps:可能出现找不到applicationContext.xml的错误!)
> 1. mvn compile
> 2.mvn test-compile
运行结果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fcc128d.png)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [Maven学习(一)- 环境搭建](http://blog.csdn.net/jolingogo/article/details/8775046)
- [Maven学习(二)- 安装m2eclipse插件 ](http://blog.csdn.net/jolingogo/article/details/8796410)
- [Maven学习(三)- 使用Maven构建Web项目](http://blog.csdn.net/jolingogo/article/details/8796726)
- [Maven学习(四)- 使用Maven构建Web项目-测试](http://blog.csdn.net/jolingogo/article/details/8797153)
- [Maven学习(五)- 使用Maven构建Struts2项目](http://blog.csdn.net/jolingogo/article/details/8798052)
- [Maven学习(六)- 构建Hibernate项目](http://blog.csdn.net/jolingogo/article/details/8798684)
- [Maven学习(七)- 构建Spring项目](http://blog.csdn.net/jolingogo/article/details/8799307)
- [Maven学习(八)- 构建MyBatis项目](http://blog.csdn.net/jolingogo/article/details/8801158)
- [Maven学习(九)- 构建SSH项目](http://blog.csdn.net/jolingogo/article/details/8811817)
- [Maven学习(十) - 阶段小结
](http://blog.csdn.net/jolingogo/article/details/8821375)
- [专栏:Maven学习之旅](http://blog.csdn.net/column/details/yuguiyang-maven.html)
';
(六)- 构建Hibernate项目
最后更新于:2022-04-01 20:44:50
前面我们使用Maven构建了Struts2项目,这里我们来试一下Hibernate项目:
ps: 昨天晚上没有整明白,例子也一直有问题,就没有完成博客,早上起来才明白错在哪![大笑](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569e21abc5518.gif)
这里的例子,大体框架应该是正确的,但是,对于Maven的很多约定都没有掌握,估计包的命名都不是非常好,等以后,理解深刻了再改吧![微笑](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-18_569ca449c5105.gif)
### 1. 构建一个基本的Web项目
这里请参考前面的博客,一样的
### 2. 添加依赖,修改pom.xml
~~~
4.0.0
com.deppon.demo
test03
war
0.0.1-SNAPSHOT
test03 Maven Webapp
http://maven.apache.org
UTF-8
junit
junit
4.10
test
org.hibernate
hibernate-core
3.6.5.Final
log4j
log4j
1.2.16
org.slf4j
slf4j-api
1.6.1
org.slf4j
slf4j-nop
1.6.4
javassist
javassist
3.11.0.GA
test03
~~~
在保存的时候,Maven会自动从库中各种包下载到本地,如果有异常的话,可以尝试手动下载
### 3. 添加hibernate.cfg.xml和log4j.properties资源文件
注意,资源文件的话,根据约定,需要放在src/main/resources文件夹下
hibernate.cfg.xml
~~~
com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc:sqlserver://localhost:1433;DatabaseName=Demo
ygy
shishi
none
org.hibernate.dialect.SQLServerDialect
thread
true
true
update
~~~
log4j.properties
~~~
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug, stdout
log4j.logger.org.hibernate.tool.hbm2ddl=debug
~~~
### 4. 新建一个实体类,测试一下
PersonEntity.java
~~~
package com.deppon.test03.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_person")
public class PersonEntity implements java.io.Serializable {
private static final long serialVersionUID = -4376187124011546736L;
private Integer id;
private String name;
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 50 , nullable = false , unique = true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "PersonEntity [id=" + id + ", name=" + name + "]";
}
}
~~~
HibernateUtil.java
~~~
package com.deppon.test03.util;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
/**ThreadLocal Session Map */
public static final ThreadLocal SESSIONMAP = new ThreadLocal();
private static final SessionFactory sessionFactory;
private static final Logger LOGGER = Logger.getLogger(HibernateUtil.class);
static {
try {
LOGGER.debug("HibernateUti.static - loading cofig");
sessionFactory = new Configuration().configure("hibernate.cfg.xml")
.buildSessionFactory();
LOGGER.debug("HibernateUtil.static - end");
} catch (Throwable ex) {
ex.printStackTrace();
LOGGER.error("HibernateUti error : ExceptionInInitializerError");
throw new ExceptionInInitializerError(ex);
}
}
private HibernateUtil() {
}
public static Session getSession() throws HibernateException {
Session session = SESSIONMAP.get();
if(session == null) {
session = sessionFactory.openSession();
SESSIONMAP.set(session);
}
return session;
}
public static void closeSession() throws HibernateException {
Session session = SESSIONMAP.get();
SESSIONMAP.set(null);
if(session != null) {
session.close();
}
}
}
~~~
测试类 ModelTest.java
~~~
package com.deppon.test03.model;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Assert;
import org.junit.Test;
import com.deppon.test03.entity.PersonEntity;
import com.deppon.test03.util.HibernateUtil;
public class ModelTest {
@Test
public void testGetSession() {
Session session = HibernateUtil.getSession();
Assert.assertNotNull(session);
HibernateUtil.closeSession();
}
@Test
public void testExport() {
new SchemaExport(new Configuration().configure()).create(true , true);
}
@Test
public void testSave() {
PersonEntity person = new PersonEntity();
person.setId(100);
person.setName("路飞");
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
session.save(person);
tx.commit();
HibernateUtil.closeSession();
}
@Test
public void testQuery() {
Session session = HibernateUtil.getSession();
session.beginTransaction();
@SuppressWarnings("unchecked")
List personList = session.createQuery("select p from PersonEntity p").list();
for(PersonEntity eachPerson : personList) {
System.out.println(eachPerson);
}
session.getTransaction().commit();
HibernateUtil.closeSession();
}
}
~~~
项目结构如下图所示:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fbf4085.png)
对了,注意一下,在上面的pom.xml中,没有看到数据库驱动包,我用的是SQL Server,直接将jar包放到了项目的lib文件夹下,而从网上查的说,使用scope引入本地的包,试了一下,好像不行,等我再试一试。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fc1b3d5.png)
### 5. 测试
如果你现在运行JUnit测试的话,是不会成功的,昨天晚上就是这个原因,提示说找不到hibernate.cfg.xml,
后来发现,在target文件夹下,并没有生成class文件,配置文件也没有,这样当然运行不成功
这里需要执行两个命令
使用CMD窗口,进入当前项目的根目录:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fc3b26a.png)
第一条命令:输入mvn compile
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fc50a58.png)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fc67e25.png)
注意:这里一定要成功啊,即 BUILD SUCCESS
第二条命令:输入mvn test-compile
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fc7f901.png)
同样的,这里一定要 BUILD SUCCESS
这样的话,再一次运行测试程序,就可以成功了!![大笑](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569e21abc5518.gif)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [Maven学习(一)- 环境搭建](http://blog.csdn.net/jolingogo/article/details/8775046)
- [Maven学习(二)- 安装m2eclipse插件 ](http://blog.csdn.net/jolingogo/article/details/8796410)
- [Maven学习(三)- 使用Maven构建Web项目](http://blog.csdn.net/jolingogo/article/details/8796726)
- [Maven学习(四)- 使用Maven构建Web项目-测试](http://blog.csdn.net/jolingogo/article/details/8797153)
- [Maven学习(五)- 使用Maven构建Struts2项目](http://blog.csdn.net/jolingogo/article/details/8798052)
- [Maven学习(六)- 构建Hibernate项目](http://blog.csdn.net/jolingogo/article/details/8798684)
- [Maven学习(七)- 构建Spring项目](http://blog.csdn.net/jolingogo/article/details/8799307)
- [Maven学习(八)- 构建MyBatis项目](http://blog.csdn.net/jolingogo/article/details/8801158)
- [Maven学习(九)- 构建SSH项目](http://blog.csdn.net/jolingogo/article/details/8811817)
- [Maven学习(十) - 阶段小结
](http://blog.csdn.net/jolingogo/article/details/8821375)
- [专栏:Maven学习之旅](http://blog.csdn.net/column/details/yuguiyang-maven.html)
';
(五)- 使用Maven构建Struts2项目
最后更新于:2022-04-01 20:44:48
在前两篇博客中,使用Maven构建了Web项目,在这篇博客中写一下,怎样构建一个简单的Struts2项目。
在准备过程中发现,要使用好Maven,个人觉得要好好利用这两个网站:
[http://mvnrepository.com/](http://mvnrepository.com/)
[http://search.maven.org/](http://search.maven.org/)
由于自己对Maven的理解不是非常深,所以学习的时候遇到很多简单的问题都没法解决![委屈](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-25_56a5a367bba9a.gif)
,走了很多弯路
### 1. 新建一个基本的Web项目
这和前面讲的是一样的,可以参考前面的博客
### 2. 添加Struts2依赖
这里主需要在pom.xml中添加一个struts-core的依赖即可:
~~~
4.0.0
com.deppon.demo
test02
war
0.0.1-SNAPSHOT
test02 Maven Webapp
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
org.apache.struts
struts2-core
2.3.1
test02
~~~
之后,Maven会自动从网上下载struts2需要的其他依赖包,可以看一下这里:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fbb0294.png)
是不是都有了,有的时候Maven可能会报错,由于网络的原因(个人认为大多是网络问题,导致下载依赖包出错![难过](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-18_569ca449b6adc.gif)
),可以从上面提到的两个网站手动下载
### 3. 新建一个Action
~~~
package com.deppon.test02.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private static final long serialVersionUID = -1417237614181805435L;
private String name;
private String password;
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;
}
/**
* 跳转到登录界面
* @return
*/
public String login_input() {
return SUCCESS;
}
/**
* 登录
* @return
*/
public String login() {
System.out.println("name->" + name);
System.out.println("password->" + password);
return SUCCESS;
}
}
~~~
struts.xml
~~~
/login.jsp
/login_success.jsp
~~~
web.xml
~~~
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
~~~
index.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
主页
去登陆
~~~
login.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
登录界面
~~~
login_success.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
登录成功
~~~
项目结构如下图所示:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce64fbcefb4.png)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [Maven学习(一)- 环境搭建](http://blog.csdn.net/jolingogo/article/details/8775046)
- [Maven学习(二)- 安装m2eclipse插件 ](http://blog.csdn.net/jolingogo/article/details/8796410)
- [Maven学习(三)- 使用Maven构建Web项目](http://blog.csdn.net/jolingogo/article/details/8796726)
- [Maven学习(四)- 使用Maven构建Web项目-测试](http://blog.csdn.net/jolingogo/article/details/8797153)
- [Maven学习(五)- 使用Maven构建Struts2项目](http://blog.csdn.net/jolingogo/article/details/8798052)
- [Maven学习(六)- 构建Hibernate项目](http://blog.csdn.net/jolingogo/article/details/8798684)
- [Maven学习(七)- 构建Spring项目](http://blog.csdn.net/jolingogo/article/details/8799307)
- [Maven学习(八)- 构建MyBatis项目](http://blog.csdn.net/jolingogo/article/details/8801158)
- [Maven学习(九)- 构建SSH项目](http://blog.csdn.net/jolingogo/article/details/8811817)
- [Maven学习(十) - 阶段小结
](http://blog.csdn.net/jolingogo/article/details/8821375)
- [专栏:Maven学习之旅](http://blog.csdn.net/column/details/yuguiyang-maven.html)
';