见鬼的背景
我真傻,真的。
最近要在一个对日的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掉了。。。
无耻的期望
- 要是有人帮我上传所有的jar到maven2仓库,然后帮我把十几个工程的maven1配置文件转为maven2的pom文件,那该多好。。。
- 有没有高人知道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
。。。感觉在被嘲笑。。。
无奈的总结
- 尽量还是用纯粹的maven工程吧(谁帮我上传jar到maven2私服,以及转换maven1配置文件为pom啊。。。);
- idea对应eclipse的classpath环境变量在
settings
的Appearence & Behavior
->Path Variables
中添加,然后不要忘记重启; - iml中依赖包的class的url要改成
jar://xxxxxx/xxxx!/
,不要忘记最后的!/
; - 不相干的插件就禁了吧。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。