一言難盡的eclipse轉IDEA

見鬼的背景

我真傻,真的。java

最近要在一個對日的java項目中作一些開發。spring

這個項目有十多年了,java工程開發一直用的eclipse + maven1。對,你沒有看錯,就是那個官方連文檔都已經再也不提供的maven1。。。更無語的是,咱們本地開發不能連外網,以前也沒有搭建maven私服,因此開發環境事實上是把maven的本地倉庫拷貝到本地,而後在eclipse工程中設置一個叫MAVEN_REPO的環境變量,從這個變量導入全部的依賴包。。。emmmm。。。盡情吐槽懶惰的咱們吧。。。eclipse

而後,自從我開始使用IDEA社區版之後,就不再想用eclipse了。。。此次回到對日項目,爲了開心地寫代碼,我天然而然萌生了把eclipse的工程導入到idea中的想法。idea自己就有導入eclipse工程的功能,but,事情固然不會像傻傻的我想象的那樣順利。。。maven

曲折的通過

永遠不會被採納的上策

原本嘛,既然工程是maven工程,直接做爲maven工程導入是最簡單也最靠譜的。。。但是就像一開始說的,由於咱們沒有maven私服,因此還須要先搭建個支持maven1私服,這個簡單,搭建一個nexus2服務就是。(nexus3不支持maven1倉庫。。。)ide

以後,找人手動上傳了依賴jar包到咱們的maven1私服。。。可是。。。若是我想把工程做爲maven工程導入idea(idea與maven有版本兼容問題,如今的idea支持的基本都是maven3.x),我還得再作一個maven2倉庫,再找人把那些jar轉到maven2倉庫(苦苦尋找maven1倉庫直接轉爲maven2倉庫的辦法,包括用maven2代理maven1之類的,可恥的失敗了。。。),而後還得把全部工程(十幾個)的maven1的配置文件(maven.xml+project.xml)轉爲pom文件。。。總以爲很麻煩。。。svn

因此,和歷史上永遠不用上策的主公們同樣,最靠譜的辦法,被無奈地pass掉了。。。

無恥的指望

  1. 要是有人幫我上傳全部的jar到maven2倉庫,而後幫我把十幾個工程的maven1配置文件轉爲maven2的pom文件,那該多好。。。
  2. 有沒有高人知道maven1倉庫直接轉爲mavan2倉庫的辦法?還望不吝賜教。。。

充滿"驚喜"的下策

上策暫不可用,那麼就暫時仍是用classpath環境變量MAVEN_REPO湊活着吧。。。emmmm。。。url

原來是一個eclipse的workspace下的十幾個project,idea對應的是一個project下十幾個module。來吧騷年。。。idea

  • 先用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協議了。。。仍然讓傻傻的我以爲有點懵逼。。。spa

固然更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. 不相干的插件就禁了吧。
相關文章
相關標籤/搜索