转载请注明出处,谢谢!

不论我们用什么ide来编辑我们的代码,最终的产品都会脱离ide来运行;正如燕飞离了巢,正如你离开了家,不期然就会运转出现问题。

- 单强 2018年1月26日11:53


大家是否也思考过:

问题1:maven项目在eclipse中正常运行,但是到了InteliJ IDEA中却空指针?报错?

问题2:为什么src/test/java中的代码可以import src/main/java中的类,反之则不行?

解答1:各ide的编译规则不同。

解答2:maven的生命周期决定的。

解决根源的处理方案:放下ide,关注maven本身,回到maven根目录下执行maven命令(虽然ide已经集成了部分maven命令)。


看到了我的解答,正在浏览本网页的你可能已经get到了我的点;但本着做事有始有终的原则,我还是要继续下去:

默认情况下(熟练使用的朋友们可更改编译时机):

eclipse保存时编译 简记为-> Ctrl S

InteliJ IDEA运行时编译 简记为-> Runtime

这就决定了在编译工作上,InteliJ IDEA是更向maven靠拢的(实际上InteliJ IDEA的编译也不完全符合maven的规范)。

我们可以用mvn help:effective-pom命令来看一下,下图只截取compile与test-compile部分

可以看出,maven的编译顺序是先编译src/main/java,后编译src/test/java;

这便解释了问题2 -> src/test/java中的代码可以import src/main/java中的类,反之则不行;因为src/test/java中的类还未被编译,所以不能import,否则会报错。

但是如果使用eclipse编辑的话,src/main/java中的代码是可以引用src/test/java中的类的,原因已在上面给出,不再赘述(没有找到的朋友们欢迎留言)。


以上述说了eclipse编辑maven项目时的弊端,InteliJ IDEA的同学们不要幸灾乐祸,我这就举一个InteliJ IDEA编辑maven时检查不到的错误。

src/main/java下的类

使用junit3,因为是在我创建maven时自动生成的,所以就用了,习惯用@Test注解的同学可以导入junit4+的包;

目录结构以及App,AppTest中的代码如图所示,可以看到在src/test/java目录下的AppTest引入了App对象。

到此一切都没有什么不一样;

下面我们在pom.xml中添加以下代码:(覆盖掉effective-pom中执行编译的部分)

<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>clean</phase>
<goals>
<goal>help</goal>
</goals>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>

我们可以看到InteliJ IDEA并没有什么异常,运行测试用例,发现运行正常,并且target目录下生成了对应的四个目录,这是IDEA的Runtime时自动编译的:

我们再执行:mvn clean test-compile

报错:

此时,由于我们修改了pom.xml文件,导致编译阶段src/main/java中的代码并没有被编译,在src/test/java中的代码也就访问不到src/main/java中的类。

IDEA自带的编译效果宣布与maven的要求不匹配,IDEA不会去关心pom.xml中的plugin来编译。


结论:maven的项目最终还是要回归到maven命令来进行编译的,所以不要依靠ide的编译;转移或发布之前请执行mvn clean package,如果success,那么恭喜,此份代码放在任何一款ide下都会正确的运行(所以朋友们就不要再问为什么我的代码在eclipse中能正常运行,而InteliJ IDEA中却不能运行了,通过本文你应该知道,即使在IDEA中能正常运行,也未必就符合maven的意图)。

git demo

maven项目 在eclipse,InteliJ IDEA中的一些问题的更多相关文章

  1. maven项目在eclipse的library中没有Maven Dependencies

    今天使用maven创建了一个多模块的项目,在分别创建完父项目和各个子模块后,编译父项目的时候,父项目工程目录上出现了一堆红叉叉,点进去一看,是找不到依赖的类,但是pom文件中相应jar的depende ...

  2. 【tomcat 无法部署】svn上下载的maven项目无法部署到tomcat中

    问题: svn上下载的maven项目无法部署到tomcat中,tomcat不识别项目,但是这个项目确实是web项目 发现的过程: 然后依次产看项目的编译版本: 项目的依赖架包: 才发现: 解决方法: ...

  3. maven项目如何从私服nexus中下载依赖包

    maven项目如何从私服nexus中下载依赖包   解决方法: 1.打开maven的config目录中settings.xml文件 2.在<profile></profiles> ...

  4. 如何把maven项目转为eclipse项目

    如何把maven项目转为eclipse项目,按照如下操作便可. 在cmd窗口, 载cmd窗口进入到maven项目所在目录下,输入如下命令: mvn eclipse:eclipse 这样便可.

  5. maven项目在eclipse中debug

    作为新手,出现bug后,debug找出bug还是很重要的,能节约大量找bug的时间 1.选中项目,右键点击-->run as -->run configurations 2.在run co ...

  6. 一个Maven项目在eclipse中正常,但在IDEA中启动时报错

    这个项目十有八九最初是在ecplise创建的,框架上十有八九整合了Mybatis,报的错误十有八九是 org.apache.ibatis.binding.BindingException: Inval ...

  7. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  8. Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  9. Maven项目搭建-Eclipse版

    一.Maven简单介绍 Maven是基于Java平台的项目构建(mvn clean install).依赖管理(中央仓库,Nexus)和项目信息管理的项目管理工具. Maven是基于项目对象模型(PO ...

随机推荐

  1. jquery图片延迟加载 及 serializeArray、serialize用法记录

    1.使用jquery实现 图片延迟加载 由于用户访问页面需要加载很多的图片,延迟加载技术在电子商务网站领域越来越普及,淘宝商城,京东商城,凡客等访问量巨大的电子商务站点为了增加用户用户体验,访问速度以 ...

  2. windows 安装Mysql压缩包

    1.将mysql压缩包解压至选定目录下 2.修改my-default.ini文件的以下内容 basedir = E:\develope_software\MySQL\mysql-advanced-5. ...

  3. RobotFrame连接MySql数据库

    RobotFrame连接MySql数据库这类的教程网上并不多,就算有,也是很多坑.小编今天为大家提供一个靠谱的教程,但是具体的包需要大家自己下载.废话不多说,看疗效~~~ 1.pip install ...

  4. c语言贪吃蛇详解5.GameOver功能与显示成绩

    c语言贪吃蛇详解5.GameOver功能与显示成绩 以前我们已经做出来了一个能吃东西变长的蛇.不过它好像不会死... 现在就来实现一下game over的功能吧. 写个函数判断蛇是否撞到自己或者撞到墙 ...

  5. CI_SMOKE配置手册

    1.1.  SVN安装 安装TortoiseSVN,并检出AutoScript目录至本地 1.2.  Java环境安装 确认测试环境安装了JDK,在cmd下键入java -version 检查JDK是 ...

  6. 使用Python实现贪心算法

    题目: 圣诞节来临了,在城市A中,圣诞老人准备分发糖果.现在有多箱不同的糖果,每一种糖果都有自己的价值和重量.每箱糖果都可以拆分成任意散装组合带走.圣诞老人的驯鹿最多只能承受一定重量的糖果.请问圣诞老 ...

  7. 一次完整的http的请求过程

    一个完整的http的完成请求过程: 输入网址-> 域名解析-> tcp的三次握手-> 建立tcp连接后发起http 请求-> 服务器响应http ,发送数据给浏览器->  ...

  8. Solidity 中文文档 —— 第一章:Introduction to Smart Contracts

    第一章:智能合约简介 粗略地翻译了 Ethereum 的智能合约开发语言的文档:Solidity.欢迎转载,注明出处. 有任何问题请联系我,本人微信:wx1076869692,更多详情见文末. 我是 ...

  9. 11、ABPZero系列教程之拼多多卖家工具 拼团提醒功能页面实现

    上一篇讲解了拼团提醒逻辑功能实现,现在继续实现页面功能. Core项目 打开AbpZeroTemplate-zh-CN.xml语言文件,在末尾添加如下代码: 文件路径:D:\abp version\a ...

  10. Java与算法之(7) - 完全二叉树

    树 下图是一"棵"树的样子.树这个名称起的很形象,整个数据结构由根.枝.叶组成,其中1为根节点,2.3是1的子节点,4.5.6.8.9.10这几个没有子节点的节点称为叶节点. 节点 ...