美文网首页好文收录程序员
手把手教你把基于 eclipse 的项目转换为基于 idea 的

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

作者: deniro | 来源:发表于2017-12-07 18:30 被阅读654次

    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 文件即可解决这个问题。

    相关文章

      网友评论

        本文标题:手把手教你把基于 eclipse 的项目转换为基于 idea 的

        本文链接:https://www.haomeiwen.com/subject/ykzrixtx.html