2014-01-13 63 views
11

今天Maven看到了一個非常奇怪的問題:它試圖構建不在我的項目中但來自依賴關係的類。 mvn compile崩潰,:Maven如何構建不在我的項目中的類?

... 
[ERROR] COMPILATION ERROR : 
[INFO] ------------------------------------------------------------- 
[ERROR] AppConstants.java):[4,12] unmappable character for encoding UTF-8 
... 

有在我的項目沒有AppConstants.java,並與grep -r AppConstants .搜索沒有給出結果。該類存在於另一個工件中,這是我的項目的依賴項。

我設法讓我的項目編譯通過-Dproject.build.sourceEncoding=Cp1252mvn compile,但這不是一個解決方案,因爲我的項目應該使用utf-8編碼。果然,以這種方式編譯時,我看到AppConstants.classtarget/classes/下,但它從哪裏來?這怎麼可能?

最近在項目中沒有任何變化,但我知道這些依賴項目正在努力將其遷移到Maven。可能會發生什麼?

UPDATE

沒有AppConstants.java文件在我的項目,而AppConstants未在項目內的任何地方提到:

$ grep -ri AppConstants .   # finds nothing 
$ find . | grep -i AppConstants # finds nothing 

AppConstants存在在我的依賴於另一個項目。我的電腦上沒有其他項目的源代碼。我的隊友都可以重現這個問題,這不是特定於我的電腦。我們的pom最近沒有變化,但我們知道其他球隊的球在最近變化很大。

我的項目中有一個類使用另一個項目中的SomeOther類。如果我使用-Dproject.build.sourceEncoding=Cp1252構建,那麼構建工作,並在我的target文件夾中,我看到SomeOther.class,AppConstants.class和另一個項目生成的幾個其他類。如果我從我的項目中刪除使用SomeOther的類,那麼我可以正常構建,但該項目無法工作,因爲它需要其他類。

@Gus:知道這是在SomeOther,你可以做一個公共安全的示例項目,展現出相同的行爲嗎?如果不這樣做,請描述水平線,以及您在哪裏運行mvn compile ......是否有多模塊項目,並且您正在構建子項目?

太難創建公共安全樣本。我的項目是多模塊,當我在頂部運行mvn compile時,它在子模塊上失敗,所以爲了更快的迭代,我已經在子模塊中運行了。結果是相同的,但更快。但你讓我想:我會檢查我們的版本是否爲其他子模塊中的其他項目生成.class文件。

共享代碼和完全POM

這是在工作,所以我不能分享完整的代碼及POM,很遺憾。如果您要求特定部分,我可以包含匿名片段。

+0

其他項目的源代碼如何成爲您的項目的一部分,因爲你預測的不同?可能你有某種產生問題的生成代碼? – khmarbaise

+2

你能提供你的pom.xml嗎? – andyf

+0

非常有趣!我們能否看到一些POM(對於您的項目和依賴項)?這可能會連接到您正在使用的某個插件。 –

回答

4

想通了:其他團隊錯誤地將.java文件放入它們的jar工件中,而不是.class文件。

因此,顯然,當Maven沒有找到編譯的類,但它找到源代碼時,它會從該源代碼本地構建類。這很聰明,現在一切都變得非常有意義。

當其他團隊修好他們的瓶子後,我們刷新了我們的Maven神器緩存,再次使用我們的utf-8編碼並且沒有任何駭人的解決方法,我們恢復了理智。

@andyf@khmarbaise@PavelHoral@Gus,謝謝大家的幫助!

+1

很高興您解決了這個問題。這可能意味着* Maven Compiler Plugin *已經將JAR作爲'javac'的源路徑。這很奇怪。但沒關係:)。 –