手把手教你把基于 eclipse 的项目转换为基于 idea 的项目

1 整理项目

首先拷贝一份项目并删除其中的版本信息。这可以利用操作系统的搜索功能。因为原项目是 SVN 工程的,所以这里搜索 .svn。

搜索 .svn

把 .svn 路径下的文件全部删除,这样项目就是变为一个纯正的本地项目咯。这样做可以避免变动原项目,以后再把这个新项目上传到版本控制系统。

2 导入 idea

打开 idea,File -> New -> Project from Existing Sources,打开导入项目对话框, 选择需要导入的项目,下一步选择 Eclispe:

选择 Eclispe 导入模式

后续采用默认配置即可,一路点击【下一步】,直到完成。

导入后会弹出一列的警告信息:


警告信息

第一个警告是因为发现未知的 eclipse 引入包。接着是检测到 spring 配置文件,最后是检测到可能用到的框架。

3 在 idea 中配置项目

点击 File -> Project Structure

【1】去除无效依赖
module -> Dependencies 去除无效依赖。

去除无效的 eclipse 依赖

【2】标记相应功能的文件夹

如果是不规范的项目文档结构,可能需要手动配置【源代码】、【资源】等文件路径:

标记相应功能的文件夹

【3】配置依赖包

点击 Libraries -> + 号,新增依赖包,非 Maven 项目一般把依赖包放在 WEB-INF 的 lib 文件夹内。如果是 Web 项目,可能还需要 servlet-api(可在 tomcat 的 lib 包下找到)。


配置依赖包

idea 还能检测到依赖包中可能用到的框架,并把它们列在右侧。

【4】配置 Facets

Facets -> + 号 -> Web,选择当前项目后,点击 OK。然后在 Web 中配置

web.xml 文件路径和 web 文件夹路径:

配置 web.xml 文件路径和 web 文件夹路径

点击右下角警告框中的 Create Artifact,创建项目开发包:


Create Artifact

然后在 Artifact 的右下角,点击 Fix -> Add all missing dependencies of '项目名称' to the artifact,把所有项目依赖包放入这个项目开发包中:


把所有项目依赖包放入这个项目开发包中

在 Facets 中配置 struts2 与 Spring 框架,如果有的话:


配置 struts2 与 Spring 框架

【5】配置 tomcat

idea 的中上部,点击 Edit Configurations

点击 + 号 -> Tomcat Server -> Local:


配置本地 Tomcat
为 tomcat 取个名字

在 Depolyment 中配置刚才创建的 artifact 包,其中的 Application context 是 web 项目的访问路径前缀:

配置部署环境

点击 tomcat 运行后,发现报错啦:

tomcat 运行抛错

这是因为 eclipse 会在代码类的头部加入一个 BOM 头字符,而 idea 是无法解析这个字符的!试过在 java Compiler 中把编译项改为 eclipse 模式,但编译时还是会报类似的错误!

下载一个 批量去除 BOM 头的工具,把 java 代码的 BOM 头都去除:

批量去除 BOM 头

这样处理后,一般情况下就能通过编译啦O(∩_∩)O~

4 插曲

4.1 spring2.x 的问题

因为是很老的项目,所以用的 spring 版本是 2.5,这在一般情况下没有问题,但如果你用的是 jdk1.8 及以上版本时,就会抛出这样一个错误:

Caused by: java.lang.IllegalStateException: Context namespace element 'component-scan' and its parser class [org.springframework.context.annotation.ComponentScanBeanDefinitionParser] are only available on JDK 1.5 and higher
    at org.springframework.context.config.ContextNamespaceHandler$1.parse(ContextNamespaceHandler.java:65)
    at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:69)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1297)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1287)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:92)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:507)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398)
    ... 75 more

明明 jdk1.8 比 1.5 高,为什么会这样呢?原来 spring2.5 启动时会检测 jdk 的版本,而版本号是写死在代码里的!无语咯……

我们可以在项目中新建一个 src 文件夹(记得把它标记为源代码文件夹哦),然后把 JdkVersion.java 放在 org.springframework.core 路径下:

JdkVersion.java

新的 JdkVersion.java 代码如下:

package org.springframework.core;

/**
 * @author Deniro Li (lisq037@163.com)
 *         2017/12/5
 */
public class JdkVersion {

    /**
     * Constant identifying the 1.3.x JVM (JDK 1.3).
     */
    public static final int JAVA_13 = 0;

    /**
     * Constant identifying the 1.4.x JVM (J2SE 1.4).
     */
    public static final int JAVA_14 = 1;

    /**
     * Constant identifying the 1.5 JVM (Java 5).
     */
    public static final int JAVA_15 = 2;

    /**
     * Constant identifying the 1.6 JVM (Java 6).
     */
    public static final int JAVA_16 = 3;

    /**
     * Constant identifying the 1.7 JVM (Java 7).
     */
    public static final int JAVA_17 = 4;

    /**
     * Constant identifying the 1.8 JVM (Java 8).
     */
    public static final int JAVA_18 = 5;


    private static final String javaVersion;

    private static final int majorJavaVersion;

    static {
        javaVersion = System.getProperty("java.version");
        // version String should look like "1.4.2_10"

        if (javaVersion.indexOf("1.8.") != -1) {
            majorJavaVersion = JAVA_18;
        } else if (javaVersion.indexOf("1.7.") != -1) {
            majorJavaVersion = JAVA_17;
        } else if (javaVersion.indexOf("1.6.") != -1) {
            majorJavaVersion = JAVA_16;
        } else if (javaVersion.indexOf("1.5.") != -1) {
            majorJavaVersion = JAVA_15;
        } else {
            // else leave 1.4 as default (it's either 1.4 or unknown)
            majorJavaVersion = JAVA_14;
        }
    }


    /**
     * Return the full Java version string, as returned by
     * <code>System.getProperty("java.version")</code>.
     *
     * @return the full Java version string
     * @see System#getProperty(String)
     */
    public static String getJavaVersion() {
        return javaVersion;
    }

    /**
     * Get the major version code. This means we can do things like
     * <code>if (getMajorJavaVersion() < JAVA_14)</code>.
     *
     * @return a code comparable to the JAVA_XX codes in this class
     * @see #JAVA_13
     * @see #JAVA_14
     * @see #JAVA_15
     * @see #JAVA_16
     * @see #JAVA_17
     */
    public static int getMajorJavaVersion() {
        return majorJavaVersion;
    }

    /**
     * Convenience method to determine if the current JVM is at least Java 1.4.
     *
     * @return <code>true</code> if the current JVM is at least Java 1.4
     * @see #getMajorJavaVersion()
     * @see #JAVA_14
     * @see #JAVA_15
     * @see #JAVA_16
     * @see #JAVA_17
     */
    public static boolean isAtLeastJava14() {
        return true;
    }

    /**
     * Convenience method to determine if the current JVM is at least
     * Java 1.5 (Java 5).
     *
     * @return <code>true</code> if the current JVM is at least Java 1.5
     * @see #getMajorJavaVersion()
     * @see #JAVA_15
     * @see #JAVA_16
     * @see #JAVA_17
     */
    public static boolean isAtLeastJava15() {
        return getMajorJavaVersion() >= JAVA_15;
    }

    /**
     * Convenience method to determine if the current JVM is at least
     * Java 1.6 (Java 6).
     *
     * @return <code>true</code> if the current JVM is at least Java 1.6
     * @see #getMajorJavaVersion()
     * @see #JAVA_16
     * @see #JAVA_17
     */
    public static boolean isAtLeastJava16() {
        return getMajorJavaVersion() >= JAVA_16;
    }

}

至此,spring2.5 与 jdk8 的兼容性问题成功解决。

4.2 hibernate 的问题

运行时,抛 hibernate 错误:

Caused by: java.io.FileNotFoundException: class path resource [hibernate] cannot be resolved to URL because it does not exist
    at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:163)
    at org.springframework.core.io.ClassPathResource.getFile(ClassPathResource.java:175)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:660)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
    ... 76 more

指的是 hibernate 找不到资源路径。因为 这个项目的 hibernate 资源文件夹下没有文件,而 idea 在开发部署时是不会创建没有包含文件的文件夹的,所以就抛错咯。

手工新建一个无用的 txt 文件即可解决这个问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,799评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,005评论 25 707
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,239评论 9 467
  • 每一张照片背后都有一个暖心的故事,一段精彩的回忆,最幸福的事情就是看着你们灿烂的微笑,送给十二岁的你们,孩子们教室...
    我本为旭阅读 280评论 0 0