maven项目只有src跟maven 引用target依赖跟pom.xml

在整合Spring + Mybatis框架的时候,自动扫描配置都已经配置好了。
配置如下:
&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&http://www.springframework.org/schema/beans&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:p=&http://www.springframework.org/schema/p&
xmlns:context=&http://www.springframework.org/schema/context&
xmlns:mvc=&http://www.springframework.org/schema/mvc&
xsi:schemaLocation=&http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd&&
&!-- 自动扫描 --&
&context:component-scan base-package=&com.aheizi& /&
&!-- 引入配置文件 --&
&bean id=&propertyConfigurer&
class=&org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&&
&property name=&location& value=&classpath:properties/jdbc.properties& /&
&bean id=&dataSource& class=&org.apache.commons.dbcp.BasicDataSource&
destroy-method=&close&&
&property name=&driverClassName& value=&${driver}& /&
&property name=&url& value=&${url}& /&
&property name=&username& value=&${username}& /&
&property name=&password& value=&${password}& /&
&!-- 初始化连接大小 --&
&property name=&initialSize& value=&${initialSize}&&&/property&
&!-- 连接池最大数量 --&
&property name=&maxActive& value=&${maxActive}&&&/property&
&!-- 连接池最大空闲 --&
&property name=&maxIdle& value=&${maxIdle}&&&/property&
&!-- 连接池最小空闲 --&
&property name=&minIdle& value=&${minIdle}&&&/property&
&!-- 获取连接最大等待时间 --&
&property name=&maxWait& value=&${maxWait}&&&/property&
&!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --&
&bean id=&sqlSessionFactory& class=&org.mybatis.spring.SqlSessionFactoryBean&&
&property name=&dataSource& ref=&dataSource& /&
&!-- 自动扫描mapping.xml文件 --&
&property name=&mapperLocations& value=&classpath*:com/aheizi/mapping/*.xml&&&/property&
&property name=&typeAliasesPackage& value=&com.aheizi.domain& /&
&!-- DAO接口所在包名,Spring会自动查找其下的类 --&
&bean class=&org.mybatis.spring.mapper.MapperScannerConfigurer&&
&property name=&basePackage& value=&com.aheizi.dao& /&
&property name=&sqlSessionFactoryBeanName& value=&sqlSessionFactory&&&/property&
&!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --&
&bean id=&transactionManager&
class=&org.springframework.jdbc.datasource.DataSourceTransactionManager&&
&property name=&dataSource& ref=&dataSource& /&
但是在install的时候报了如下错误:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.aheizi.dao.UserMapper.selectByUserId
at org.apache.ibatis.binding.MapperMethod$SqlCommand.&init&(MapperMethod.java:184)
at org.apache.ibatis.binding.MapperMethod.&init&(MapperMethod.java:38)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:49)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:42)
at com.sun.proxy.$Proxy11.selectByUserId(Unknown Source)
at com.aheizi.service.impl.UserServiceImpl.getUserById(UserServiceImpl.java:20)
at com.aheizi.testmybatis.TestSpringDemo.test1(TestSpringDemo.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
显示绑定错误,分析可知应该是在UserMapper接口和SQL的隐射文件没有结合。
第一时间检查了mapper的namespace属性,确认没有错。
后来查看了target/classes/../mapping并不存在,也就是说mapper.xml文件并没有在编译的时候放进classes中。
那么接口当然绑定不了selectByUserId这个方法。
查资料得知,有两个解决办法:
1.在pom.xml中添加如下代码:
&resources&
&resource&
&directory&src/main/resources&/directory&
&includes&
&include&**/*.properties&/include&
&include&**/*.xml&/include&
&/includes&
&filtering&true&/filtering&
&/resource&
&resource&
&directory&src/main/java&/directory&
&includes&
&include&**/*.xml&/include&
&/includes&
&filtering&true&/filtering&
&/resource&
&/resources&
添加完成后,install仍然报错,查看classes文件,xml文件已经存在,但是却出现了其他问题,jdbc驱动找不到了,唉,无力。
解决不了心里很不舒服啊,花了一下午,终于解决了,将上面的文件修改为:
&resources&
&resource&
&directory&src/main/resources&/directory&
&/resource&
&resource&
&directory&src/main/java&/directory&
&includes&
&include&**/*.xml&/include&
&/includes&
&filtering&true&/filtering&
&/resource&
&/resources&
意思是maven在编译的时候class文件夹下包含src/main/resources下的文件与src/main/java下的*.properties文件。
上面一个直接指定,会加载不了。
这样处理让我感觉有点别扭。
2.将mapper.xml映射文件放到resources文件夹下。
文件目录如下:
运行就不会报错了,但是我看着还是有点别扭,就是看着不爽,等以后想到好办法之后再换吧。
我就纳了个闷了,maven这样限制xml文件的位置,即没让我觉得美观,也没有感到实用。
阅读(...) 评论()Maven学习笔记(二)——Maven目录结构、pom.xml解析&基础命令(一)
上篇blog学习了Maven的下载与安装,有了家伙就可以放手去干活了,所以本篇blog我们开始学习Maven的一些基本使用方法。
Maven的约定目录结构
使用Maven管理项目的话,那么项目的结构目录务必要按照Maven约定的目录结构来创建项目,我们在官方文档中可以看到Maven提供的目录结构图:
简单介绍一下每个目录下应当存放的文件类型,在官网中可以看到标准的Introduction to the Standard Directory Layout,如下图所示:
显而易见,每个目录下应当放什么样类型的文件都说的很清楚了,一般情况下常用的是以下4个目录,
src/main/java
存放项目的java类源文件,即:Xxx.java
src/main/resources
存放项目的资源文件,如spring、mybatis的配置文件等等
src/test/java
存放项目的用于测试的java类源文件,即:XxxTest.java
src/test/resources
存放项目的测试相关的资源文件
在上面的上面的图中我们还看到了一个pom.xml配置文件,这个文件很重要,它是Maven的核心配置文件,我们的项目版本,jar包依赖等等都以标签的形式保存在了这个配置文件中,在官方文档中也可以具体查看关于这个文件的介绍:
我在上图中标记出来的4个元素是必须配置的4个基础元素,至于为什么,我们可以在Introduction to the POM中看一下pom.xml的Minimal POM:
显而易见,已经说的很清楚了,the minimum requirement for a POM的配置,缺一不可。如果懒得看那一大段英文的原版解释,那么我下面就简要的解释一下这4个元素的含义。
modelVersion ——描述这个pom.xml文件是遵从哪个版本的项目描述符,maven3应当设置成4.0.0
groupId ——指明了创建项目的组织的唯一标识符,一般就是包名了
artifactId ——指的是项目中的主要的模块名(primary artifact),默认命名方式是“项目名-模块名”
version ——指的是项目模块的版本,通常使用的是Maven的快照版本(例如:0.0.1-SNAPSHOT)
Maven的目录结构清楚了之后,我们现在就通过手动创建文件夹的方式去创建一个Maven结构的项目并尝试编译运行。不过在此之前我们需要一个包含文件头的pom.xml的模板文件,在哪找呢?很简单,现在许多开源项目都是通过maven去打包的,比如mybatis,我们找到mybatis的jar包,解压后可以在如下目录中看到pom.xml文件:
把pom.xml拷贝出来,删除掉多余的部分,只留一个文件头即可:
&?xml version="1.0" encoding="UTF-8"?&
&project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&
&/project&
好了,现在我们就可以根据上面介绍的Maven目录和pom.xml的必备元素来手动构建一个基于Maven的java项目了。
创建基于Maven的Java项目
首先我们依据Maven约定的目录结构创建文件夹以及pom.xml文件,如下图所示,首先在src/main/java目录下创建我们的java类源文件:
代码很简单,返回一个字符串:
package com.wl.maven01.
public class HelloWorld{
public String sayHello(){
return "Hello World!";
}接下来在src/test/java目录下创建用于测试的测试类java源文件:
主要用于测试HelloWorld类的sayHello方法的返回值与断言是否一致,代码如下:
package com.wl.maven01.
import org.junit.*;
import org.junit.Assert.*;
public class HelloWorldTest{
public void testHello(){
Assert.assertEquals("Hello World!",new HelloWorld().sayHello());
这里引入了junit的jar包,Maven的一大特点就是通过pom.xml去管理jar包以及相关依赖,我们只需要在配置文件中写入依赖的相关配置,那么Maven就会自动从Maven中央仓库中将我们的jar包下载到本地仓库,关于依赖和仓库的概念后面再细说,这里我们只需要知道我们的Maven项目不必再手动将jar包add到项目的classpath中,而是在pom.xml中声明即可,Maven会自动下载到本地。下面看看我们的pom.xml文件:
&?xml version="1.0" encoding="UTF-8"?&
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&
&modelVersion&4.0.0&/modelVersion&
&groupId&com.wl.maven01&/groupId&
&artifactId&maven-test&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&dependencies&
&dependency&
&groupId&junit&/groupId&
&artifactId&junit&/artifactId&
&version&4.11&/version&
&/dependency&
&/dependencies&
&/project&
可以看到我们通过&dependency&元素来声明了我们的依赖jar包,当我们编辑pom文件后保存的时候Maven就会自动去下载jar包了,这也是Maven最主要的优点之一。配置文件和java文件都写好之后,我们就可以通过Maven去编译、测试以及打包我们项目了。
编译(compile)、测试(test)和打包(package)
首先是编译项目,我们在命令行下切换到我们Maven项目的根路径下:
通过Maven命令mvn compile编译项目:
在上图中我们可以看到Compiling 1 source file to xxx BUILD SUCCESS字样,即编译了一个源文件到D盘的Maven01/target/classes目录下,下面我们再观察一下之前的Maven项目目录:
和Maven的输出信息一致,确实生成了target文件夹,这就是Maven规定的用于存放编后的字节码文件的目标文件夹,同样的在意料之中,我们编译后的字节码文件也在这个target文件夹下,如下图所示我们可以看到编译后的class文件:
熟悉了Maven的第一个命令之后,我们可以再进行测试,即通过mvn test命令来对运行我们Maven项目的单元测试:
如上图所示,Running com.wl.maven01.model.HelloWorldTest BUILD SUCCESS字样,显而易见的已经成功运行了我们的测试类。但是在target文件夹下又多出了2个文件夹:
surfire-reports目录用于存放生成的测试报告,而test-classes同理肯定是用于存放测试类编译后的字节码文件了。
最后我们再看一下打包命令——mvn package:
如上图所示,Building jar:xxx.jar BUILD SUCCESS,很明显打包成功,打好的jar包在D:/Maven01/target根目录下,我们可以在指定的目录中看到它:
本篇blog介绍了Maven的约定目录结构以及Maven的三个基本命令——compile、test和package,下一篇blog将继续介绍Maven的部分命令以及Maven的一些核心概念。
没有更多推荐了,  由于最近工作学习,总是能碰到Maven的源码。虽然平时工作并不使用Maven,但是为了学习一些源码,还是必须要了解下。这篇文章不是一个全面的Maven解析,而是一个简单的介绍,包括Eclipse中如何使用Maven,如何利用Maven工程学习。
  循序渐进,你将会学到下面的知识:
  maven的相关书籍!
  什么是maven?
  如何在eclipse中使用maven?
  maven的工程是什么样子?
  Eclipse中maven的常用命令!
  相关书籍
  首先推荐两本书,都是网上找的pdf。由于我自己没有工作需求,因此也只是简单的了解一下而已,并没有深入的研究。有兴趣的朋友,可以多看看这两本书。
  什么是maven?
  Maven是一个用于项目构建的工具,通过它便捷的管理项目的生命周期。即项目的jar包依赖,开发,测试,发布打包。
  下面我自己总结一下它的几个特点,看了这些特点,也许对maven有更多的了解。
  1 jar包依赖
  这个也许会maven最突出的特点了使用maven不需要上网单独下载jar包,只需要在配置文件pom.xml中配置jar包的依赖关系,就可以自动的下载jar包到我们的项目中。这样,别人开发或者使用这个工程时,不需要来回的拷贝jar包,只需要复制这个pom.xml就可以自动的下载这些jar包。
  而且,我们自己下载jar包,还有可能造成版本的不一致,这样在协同开发的过程中就有可能造成代码运行的不一致。通过使用maven精确的匹配jar包,就不会出现这种问题了。
  2 项目坐标
  Maven通过特定的标识来定义项目名称,这样既可以唯一的匹配其他的jar包,也可以通过发布,使别人能使用自己的发布产品。这个标识就被叫做坐标,长的其实很普通,就是简单的xml而已:
&groupId&com.test&/groupId&
&artifactId&maventest&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&packaging&jar&/packaging&
&name&maventest&/name&
&url&http://maven.apache.org&/url&
  groupId:所述的项目名称,由于有的项目并不是一个jar包构成的,而是由很多的jar包组成的。因此这个groupId就是整个项目的名称。
  artifactId:包的名称。
  version:版本号。
  packaging:包的类型,一般都是jar,也可以是war之类的。如果不填,默认就是jar。
  name和url,一个是名称,一个是maven的地址。主要就是上面的几个参数。
  当想要依赖什么jar的时候就可以通过下面的方式依赖:
1 &dependencies&
&dependency&
&groupId&junit&/groupId&
&artifactId&junit&/artifactId&
&version&3.8.1&/version&
&scope&test&/scope&
&/dependency&
&/dependencies&
  各个属性的内容基本上都是一样的。
  这里要注意的是jar包的命名规则:
  artifactId-version[-classifier].packaging
  比如上面的pom.xml生成的jar包名字就是:maventest-0.0.1-SNAPSHOT.jar。
  这里的classifier是可选的,但是有的项目可能还需要导出附属的一些文件,如javadoc,source等等,那么这个地方就需要配置一个字符串。一般都是JDKXXX之类的。
  3 测试驱动
  Maven是测试驱动的开发思路,因此工程创建初期,就包含两个文件夹,main和test。一个用于放置开发的java文件,一个用于写test单元测试。这样每次开发的时候,提前设计单元测试,就能帮助减少BUG。
  如何在eclipse中使用maven
  我使用的eclipse有自带的maven插件,因此直接创建就可以了。这里就不介绍如何安装maven了。下面介绍一下maven工程的创建:
  1 如何创建maven工程:
  直接点击新建,在里面可以找到Maven选项卡,点击Maven Project创建Maven工程
  2 选择默认的工程位置
  3 创建工程,红色是创建普通的maven工程的。粉色是创建web工程的。
  6 填写相关的groupId artifactId version等信息
  点击完成就创建好了一个简单的maven工程。
  maven工程是什么样子的?
  maven的工程一般都是如下的结构:
first_maven
|-- pom.xml
`-- App.java
`-- resources
`-- META-INF
`-- application.properties
`-- AppTest.java
  pom.xml:用于定义或者添加jar包的依赖
  src-main:用于存放java源文件
  src-test:用于存放测试用例。
  也许工程下还会出现target文件夹,这个是用来生成对应的class文件或发布的jar包。
  Eclipse中maven常用的命令
  点击Run As就可以发现几个Maven的命令:
  Maven Build:
  这个命令用于编译Maven工程,执行命令后会在target文件夹中的classes中生成对应的class文件。
  Maven Clean:
  删除target文件夹,即删除生成的package包以及class等文件。
  Maven Test:
  先自动进行编译,在运行所有的测试用例。
  Maven install:
  发布生成对应的package包。
  注意:
  留意上面的命令的作用,build和test都会生成相应的class文件。也就是说,当你新建一个maven工程,或者clean一个maven工程后,如果没有使用这两个命令,直接针对类进行测试,会跑出java.class.notfound的错误。因为此时还没有编译生成class文件,如果有朋友发现这个问题注意一下就好了。(该部分只针对旧版本,新版本如maven3.3是可以自动编译的)
  只有使用了上面的两个命令后,才能针对某个类进行单元测试。
阅读(...) 评论()Maven提交项目时忽略target目录
windows -& Preferences -& Team -& Ignored Resources -& Add Pattern -& */target/* -& Apply -& OK
原文地址:http://blog.csdn.net/dings503/article/details/
没有更多推荐了,maven项目没有src/main/java和src/test/java
直接右键项目,build path&&configure build path
点击source
点击add folder
直接在这个界面输入src/main/java
重复上述步骤
然后修改输出目录:
src/main/java和src/main/resources对应的是target/classes
src/test/java对应的是target/test-classes
根治方法还在研究中!!!
没有更多推荐了,

我要回帖

更多关于 maven pom详解 的文章

 

随机推荐