2015-09-16 75 views
1

我試圖建立與gradle這個Android項目中的:這是一個庫項目與NDK的味道,與外部.jar五香,統一禮貌。無法編譯,除非的.jar包含在引導類路徑

我真的不認爲有關文件的gradle細節是很重要的,只要說我包括外部jar文件(通過統一提供)的東西,如:

dependencies { 
    compile files('libs/unity.jar') 
    } 

實際上似乎工作,因爲Java編譯期間,gradle這個問題的命令,如:

BASE="<Some directory>" 
javac -d "${BASE}/PluginsSources/Android/libproject/build/intermediates/classes/fat/debug" \ 
    -g -encoding UTF-8 \ 
    -bootclasspath /Users/myusername/Applications/adt/sdk/platforms/android-23/android.jar \ 
    -sourcepath "${BASE}/PluginsSources/Android/libproject/build/tmp/compileFatDebugJavaWithJavac/emptySourcePathRef" \ 
    -classpath "${BASE}/PluginsSources/Android/libproject/libs/unity.jar" \ 
    "${BASE}/PluginsSources/Android/libproject/src/main/java/org/example/ScriptBridge/JavaClass.java" \ 
    "${BASE}/PluginsSources/Android/libproject/build/generated/source/r/fat/debug/org/example/ScriptBridge/R.java" \ 
    "${BASE}/PluginsSources/Android/libproject/build/generated/source/buildConfig/fat/debug/org/example/ScriptBridge/BuildConfig.java" \ 
    -XDuseUnsharedTable=true 

縮進和BASE變量通過你的真正增加。請注意,unity.jar是一個類路徑條目。

問題是,編譯失敗作爲javac的顯然是無法編譯時,除非罐子放入-bootclasspath選項找到一類unity.jar(!!)。

爲什麼會發生這種情況? AFAIK,類的搜索路徑應該是分層的,在bootclasspath之後,javac應該搜索類路徑...

是否有可能告訴gradle將一些jar粘貼到bootclasspath somhow(這會笨拙地解決問題)?

是不是有一個更清潔/更好的辦法?

謝謝你的任何見解!

回答

1

編輯:

仔細推敲後,它看起來像classpath作品和它的接管世界的第一步統一技術並沒有創造一個突變的classpath-彈性罐子(驚喜!) ,畢竟...

該問題是在compile語句的路徑中,將正確的相對路徑替換爲jar後,一切按預期工作。

這個問題的觀點的答案是:

Q1:爲什麼會出現這種情況?

因爲基於java無法找到一個罐子一類不存在

Q2:是否有可能告訴gradle這個堅持一些水罐裏的引導類路徑somhow?

見下

Q3的回答:是有一個更清潔/更好的辦法?

呀:確保路徑無論你是連接是正確的可能是一個良好的開端:)

注意,搖籃不會發出任何錯誤失蹤jar S,甚至沒有在調試模式(這是一個臭名昭着的恕我直言)。


OLD ANSWER

我解決問題我自己,不知爲什麼(我不認爲我的解決方法是最佳的,但考慮到關注這個問題,我想這是好,因爲它是會得到...)

Q1:爲什麼會發生這種情況?

據我瞭解,沒有翻轉原因。

文件:

How Classes are Found (Oracle canon)

明確規定,在自舉類是:

自舉類是實現Java 2平臺的類。

即用於實現平臺的類。這就是爲什麼android.jar在那裏,而unity.jar不應該

Q2:是否可以告訴gradle將一些jar粘貼到bootclasspath somhow中?

是的!下面的鏈接將詳細介紹如何:

Modify bootclasspath in compiler args (gradle forums)

,那就是:

allprojects { 
    gradle.projectsEvaluated { 
    tasks.withType(JavaCompile) { 
     options.compilerArgs << "Xbootclasspath/a:src/main/libs/unity.jar" 
    } 
    } 
} 

它,在我的項目映射到Android的一個後加載unity.jar存檔,地處src/main/libs目錄我的android圖書館。

問題3:有更清潔/更好的方法嗎?

我不這麼認爲,至少不是沒有理解爲什麼jar需要首先引導(這會使這裏的大部分問題毫無意義):更改引導類路徑不是什麼高級程序員應該做,所以我不希望gradle提供更簡潔的捷徑。

我仍然在等待某個人對這個問題有一些見解(我不能在這個問題上沉淪更多),但是我希望這會幫助別人。

相關問題