2

见鬼的背景

我真傻,真的。

最近要在一个对日的java项目中做一些开发。

这个项目有十多年了,java工程开发一直用的eclipse + maven1。对,你没有看错,就是那个官方连文档都已经不再提供的maven1。。。更无语的是,我们本地开发不能连外网,之前也没有搭建maven私服,所以开发环境事实上是把maven的本地仓库拷贝到本地,然后在eclipse工程中设置一个叫MAVEN_REPO的环境变量,从这个变量导入所有的依赖包。。。emmmm。。。尽情吐槽懒惰的我们吧。。。

然后,自从我开始使用IDEA社区版以后,就再也不想用eclipse了。。。这次回到对日项目,为了开心地写代码,我自然而然萌生了把eclipse的工程导入到idea中的想法。idea本身就有导入eclipse工程的功能,but,事情当然不会像傻傻的我想象的那样顺利。。。

曲折的经过

永远不会被采纳的上策

本来嘛,既然工程是maven工程,直接作为maven工程导入是最简单也最靠谱的。。。可是就像一开始说的,因为我们没有maven私服,所以还需要先搭建个支持maven1私服,这个简单,搭建一个nexus2服务就是。(nexus3不支持maven1仓库。。。)

之后,找人手动上传了依赖jar包到我们的maven1私服。。。但是。。。如果我想把工程作为maven工程导入idea(idea与maven有版本兼容问题,现在的idea支持的基本都是maven3.x),我还得再做一个maven2仓库,再找人把那些jar转到maven2仓库(苦苦寻找maven1仓库直接转为maven2仓库的办法,包括用maven2代理maven1之类的,可耻的失败了。。。),然后还得把所有工程(十几个)的maven1的配置文件(maven.xml+project.xml)转为pom文件。。。总觉得很麻烦。。。

所以,和历史上永远不用上策的主公们一样,最靠谱的办法,被无奈地pass掉了。。。

无耻的期望

  1. 要是有人帮我上传所有的jar到maven2仓库,然后帮我把十几个工程的maven1配置文件转为maven2的pom文件,那该多好。。。
  2. 有没有高人知道maven1仓库直接转为mavan2仓库的办法?还望不吝赐教。。。

充满"惊喜"的下策

上策暂不可用,那么就暂时还是用classpath环境变量MAVEN_REPO凑活着吧。。。emmmm。。。

原来是一个eclipse的workspace下的十几个project,idea对应的是一个project下十几个module。来吧骚年。。。

  • 先用idea创建一个空的project,暂时不创建module
  • 然后通过VCS菜单的Checkout from version control -> subversion 从svn仓库下载十几个工程到project目录下,引导过程的最后,不要打开module,选No
  • 然后通过File -> New -> Module from existing sources 导入project目录下的原eclipse工程作为idea的Module
此处需要注意原来的工程之间如果有依赖关系,最好从依赖最底层开始导入Module。
  • 这个时候,代码当然是编译不过的,首先要设置jdk,然后当然还是编译不过,因为所有MAVEN_REPO的依赖包都找不到。
到此为止,用上策还是下策都是一样一样的。。。
  • 好吧,下策的表演开始了。。。先傻乎乎地把maven1本地仓库拷贝到我本地来;
  • 然后你需要在File -> settings -> Appearence & Behavior -> Path Variables中添加环境变量MAVEN_REPO,指向本地maven1仓库,然后别忘了重启IDEA;
  • 重启IDEA之后,你会发现依赖包都进入工程的External Libraries了,开心吧。。。呵呵,吐样吐森破。。。你会发现你的代码中还是很多import失败,对应依赖包的类还是找不到。。。WTF。。。
  • 然后我们打开idea帮我们自动生成的iml文件,会发现每个library的class里的url的协议是file://,就像下面这样:
    <orderEntry type="module-library" exported="">
      <library name="commons-net-2.0.jar">
        <CLASSES>
          <root url="file://$MAVEN_REPOSITORY$/commons-net/jars/commons-net-2.0.jar" />
        </CLASSES>
        <JAVADOC />
        <SOURCES />
      </library>
    </orderEntry>
上面的环境变量之所以是MAVEN_REPOSITORY而不是MAVEN_REPO,我猜啊,是因为IDEA的maven插件会使用MAVEN_REPOSITORY这个环境变量指向maven2本地仓库,而我本地maven1仓库与maven2仓库当然是一个目录了。所以这里应该是idea把MAVEN_REPO替换成了MAVEN_REPOSITORY。。。至于IDEA为啥会替换这个,我猜测的原因对不对。。。唉,你爱信不信,反正我信了。。。
  • emmmm。。。既然是引入jar,为什么用file协议而不直接用jar协议。。。本着死马当活马医的精神,把url瞎改了一下:
    <orderEntry type="module-library" exported="">
      <library name="commons-net-2.0.jar">
        <CLASSES>
          <root url="file://$MAVEN_REPOSITORY$/commons-net/jars/commons-net-2.0.jar" />
          <root url="jar://$MAVEN_REPOSITORY$/commons-net/jars/commons-net-2.0.jar!/" />
        </CLASSES>
        <JAVADOC />
        <SOURCES />
      </library>
    </orderEntry>
  • 然后。。。import失败的错误真的消失了。。。为什么加个jar协议就好了?为什么idea自动生成的iml用file协议?傻傻的我表示很懵逼。。。哪位高人知道原因还烦请相告。。。
  • 期间还发生一件事。。。我的工程并不是spring工程,但是编译的时候idea的spring插件报错了。。。只好先disable你了。。。

下策之所以是下策,因为真的很low

用这个下策吧,真的也很麻烦,因为你得改每个iml的每个依赖包的url。。。当然,如果你是一个一个module导入的,后面的module导入时自动生成的iml里的依赖包的url似乎都是jar协议了。。。仍然让傻傻的我觉得有点懵逼。。。

当然更low的还是添加MAVEN_REPO这个环境变量,用来指向拷贝到本地的maven1仓库,然后idea又神奇的给你换成了MAVEN_REPOSITORY。。。感觉在被嘲笑。。。

无奈的总结

  1. 尽量还是用纯粹的maven工程吧(谁帮我上传jar到maven2私服,以及转换maven1配置文件为pom啊。。。);
  2. idea对应eclipse的classpath环境变量在settingsAppearence & Behavior -> Path Variables中添加,然后不要忘记重启;
  3. iml中依赖包的class的url要改成jar://xxxxxx/xxxx!/,不要忘记最后的!/
  4. 不相干的插件就禁了吧。

下塘烧饼
97 声望17 粉丝

个人文章迁移到知乎了:[链接]