• eclipse下的maven


    安装maven插件

    老版本eclipse使用maven需要自己安装插件具体步骤可以百度m2eeclipse插件,新版本eclipse已经集成了maven。

    安装完毕检查User Settings是否指定maven的配置文件,如果没有需要自己手动选择maven配置。

    创建maven项目

     

    点击finish完成创建。

    结构如下:

    发现比正常结构丢失了两个源文件夹,src/main/java;src/test/java,这是因为构建时maven默认使用的jdk1.5,而eclipse配置的jdk默认版本可能不一样,导致了这样的问题。

    看下图:

    我的eclipse默认的是1.7

    而maven默认是1.5,查看项目buildpath发现jre显示为1.5,实际是1.7。。。

    我们手动修改下buildpath的jre,或者直接移除掉(eclipse中的maven项目不推荐去手动调整jdk,通常我们在pom.xml中调整编译插件,然后右键maven-updateProject,eclipse会自己调整依赖jdk版本),点击完成即可恢复缺失的源文件夹。

    完成后如下图:

    pom.xml配置

    根据需要配置项目的依赖构件,插件最少配置有一个编译插件,否则运行maven命令时默认将以jdk1.5去编译执行。除非你手动修改项目buildpath更改jdk版本并且不使用maven命令去编译(runas...javaApplication),但不推荐这样做,因为maven项目每次右键updateProjec时eclipse会自动修改jdk组件为pom.xml的插件指定的版本,即使pom没有配置编译插件,那么将是默认的jdk1.5。

    eclipse中开发maven项目不推荐配置tomcat服务器插件,因为你的项目中将会多出一些依赖,如servlet-api等..,推荐直接buildpath中添加eclipse配置的tomcat server组件,我们会省去很多麻烦。

     

    另外要注意tomcat容器的运行环境要跟pom.xml中指定jdk版本一致,因为我们的项目是以pom中指定的编译插件版本去编译的,编译后交给tomcat容器去执行,tomcat会根据你配置时指定的jre去运行它自己,然后它再去执行项目,如果你给tomcat配置的jre与pom指定的不一致,那么很有可能项目运行不起来。

    项目打包

    可以直接右键export-war把项目打包成war包,去放到服务器去执行,也可以执行maven的打包命令去打包,它是以pom指定的packaging来打包的。

    两种方式没有区别,第一种打包方式在打包时会把maven中的所有依赖jar文件全部放在WEB-INF/lib文件夹中,以及src/main中的资源及编译后的class文件放在classes目录中,这是标准的tomcat目录结构。第二种我并没有测试,我猜测最后打包的结果应该是一样的,另外注意第二种方式的打包时如果是要在tomcat容器下运行并且依赖中有servlet-api等tomcat容器中已经包含的jar构件的话请给它加上scope标签,并指定为provided,只在编译的classpath中加载和使用,打包的时候不会包含在目标包中,否则当你部署到tomcat容器运行时将会报错。

    推荐第一种方式非常简单:

    finish即可完成。

    问题总结

    今天在做公司项目迁移到maven时,发现一个奇怪的问题,分享给大家。

    项目中有一个java源文件,不知道哪位同事不小心手误还是怎么回事,在这个文件中发现他import了一个com.sun.xml.internal.ws.developer.MemberSubmissionAddressing,然后导致maven编译一致报错,找不到com.sun.xml.internal.ws.developer程序包,这个包是jdk中的一个api,不知道什么用,但它确实是在我的项目jdk下,我能找的到他,但maven一直报错,很郁闷。

    然后百度有人说在pom.xml编译插件中加上

    <compilerArguments> 
      <bootclasspath>${JAVA_HOME}/jre/lib/rt.jar</bootclasspath> </compilerArguments>

    然后问题就解决了,但是为什么解决了呢?继续百度,然后找到了这个篇文章,http://blog.csdn.net/smilingleo/article/details/5005538

    很奇怪的bootclasspath参数

    尝试下面代码:

    import sun.util.resources.LocaleData;  
    public class SunTest{  
        public SunTest(){  
        }  
          
    }  

    编译时报错:

    C:/Temp>javac -verbose SunTest.<a href="http://lib.csdn.net/base/javase" class='replace_word' title="Java SE知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>  
    [解析开始时间 SunTest.java]  
    [解析已完成时间 63ms]  
    [源文件的搜索路径: .]  
    [类文件的搜索路径: C:/Java/jdk1.6/jre/lib/resources.jar,C:/Java/jdk1.6/jre/lib/  
    rt.jar,C:/Java/jdk1.6/jre/lib/sunrsasign.jar,C:/Java/jdk1.6/jre/lib/jsse.jar,C:/  
    Java/jdk1.6/jre/lib/jce.jar,C:/Java/jdk1.6/jre/lib/charsets.jar,C:/Java/jdk1.6/j  
    re/classes,C:/Java/jdk1.6/jre/lib/ext/dnsns.jar,C:/Java/jdk1.6/jre/lib/ext/local  
    edata.jar,C:/Java/jdk1.6/jre/lib/ext/sunjce_provider.jar,C:/Java/jdk1.6/jre/lib/  
    ext/sunmscapi.jar,C:/Java/jdk1.6/jre/lib/ext/sunpkcs11.jar,.]  
    SunTest.java:1: 找不到符号  
    符号: 类 LocaleData  
    位置: 软件包 sun.util.resources  
    import sun.util.resources.LocaleData;  
                             ^  
    [正在装入 java/lang/Object.class(java/lang:Object.class)]  
    [正在检查 SunTest]  
    [总时间 187ms]  
    1 错误  

    添加javac编译参数,指定bootclasspath,编译错误消失:

    C:/Temp>javac -bootclasspath C:/Java/jdk1.6/jre/lib/rt.jar -verbose SunTest.java  
    [解析开始时间 SunTest.java]  
    [解析已完成时间 15ms]  
    [源文件的搜索路径: .]  
    [类文件的搜索路径: C:/Java/jdk1.6/jre/lib/rt.jar,C:/Java/jdk1.6/jre/lib/ext/dns  
    ns.jar,C:/Java/jdk1.6/jre/lib/ext/localedata.jar,C:/Java/jdk1.6/jre/lib/ext/sunj  
    ce_provider.jar,C:/Java/jdk1.6/jre/lib/ext/sunmscapi.jar,C:/Java/jdk1.6/jre/lib/  
    ext/sunpkcs11.jar,.]  
    [正在装入 sun/util/resources/LocaleData.class(sun/util/resources:LocaleData.clas  
    s)]  
    [正在装入 java/lang/Object.class(java/lang:Object.class)]  
    [正在检查 SunTest]  
    [已写入 SunTest.class]  
    [总时间 192ms]  

    编译错误问题的原因是bootClassLoader没有找到sun.util.resources.LocaleData这个类,从sun的文档中得知,sun不鼓励开发人员直接使用sun.*里面的代码,主要的原因是sun.*里面的代码就是实现jvm的底层代码,是平台相关的,而且相关实现随着版本升级随时可能会被替换,代码的稳定性、一致性等等都存在问题。

    但是这并不是问题的关键。从verbose信息中可以看出,两次编译过程中搜索路径(classpath)中都包含rt.jar,但是为什么显式地指定一下-bootclasspath之后就会让bootclassloader加载sun.*呢?

    没有找到答案,可能只有得到sun sdk的源码才能发现问题的原因。

    这个讨论比较有价值:http://forums.sun.com/thread.jspa?threadID=5356024&start=0

  • 相关阅读:
    对Cost (%CPU) 粗略的理解
    SQL AND &amp; OR 运算符
    [Nagios] Error: Template &#39;timman&#39; specified in contact definition could not be not found (c
    质因数分解
    细数人体器官仿生,还有哪些可开发的
    利用京东云擎架设免费Wordpress 博客(git方式)
    C++内存管理变革(6):通用型垃圾回收器
    二分查找法
    百度云存储教程---免费建立自己的静态网站
    paip.提升效率---filter map reduce 的java 函数式编程实现
  • 原文地址:https://www.cnblogs.com/hihtml5/p/6581483.html
Copyright © 2020-2023  润新知