如何才能讓mcc
識別從用戶提供的Java庫導入,或簡單地忽略無法解析的導入?Matlab編譯器從動態Java類路徑導入Java類時的MCC錯誤
我有一個使用Matlab編譯器構建的Matlab代碼庫,但構建打破原因,因爲mcc
在遇到關於Matlab的動態類路徑中的JAR中的Java類的import
語句時出錯。我將包含mcc -a
選項的類路徑中的所有JAR文件。該代碼在IDE中工作,並且我認爲它將在部署的應用程序中起作用,如果它只允許我構建的話。 (在R2009b下工作,忽略非MCOS類中的這些輸入。)
下面是一個簡單的repro。該文件與Google Guava中的guava-11.0.1.jar具有相同的目錄。
%file hello_world_with_import.m
function hello_world_with_import
import com.google.common.base.Stopwatch;
disp('Hello, world!');
end
在Matlab中運行它工作正常。但建設失敗。 (這裏的javaaddpath
不在例如嚴格必要的,因爲糟糕的進口本身並不是純Matlab的錯誤。只是顯示它如何在實踐中,我多麼希望mcc
拿起它。)
>> javaaddpath('guava-11.0.1.jar');
>> hello_world_with_import()
Hello, world!
>> mcc -m -a guava-11.0.1.jar hello_world_with_import
Error: File: C:\Temp\import_test\hello_world_with_import.m Line: 3 Column: 8
Arguments to IMPORT must either end with ".*"
or else specify a fully qualified class name: "com.google.common.base.Stopwatch" fails this test.
Unable to determine function name or input/output argument count for function
in MATLAB file "hello_world_with_import".
Please use MLINT to determine if this file contains errors.
Error using mcc
Error executing mcc, return status = 1 (0x1).
這是在Windows上的Matlab R2011b。
關於我的環境的一些背景。我的應用程序在動態類路徑上有大約40個JAR,它們是第三方庫和我們自己的Java代碼的混合體。它通過單用戶和多用戶Windows機器的組合部署到50多個用戶。還有其他組織可能會將其他MCR應用程序部署到相同的用戶和計算機上。在任何機器上,不同的MCR應用程序可以由相同或不同的用戶同時運行。我們每週發佈一次,並且(主要是由於我們自己的Java代碼的變化)至少有一個JAR文件在其他版本中發生了變化。我需要一種能夠在這種環境下工作的機制。
有什麼建議嗎?任何人都知道在編譯步驟中將mcc
添加到其java類路徑的好方法,或者只是忽略僞造的導入?我的備用計劃是通過代碼庫並刪除Java類的所有導入,這很痛苦。
UPDATE 12/2/2012:我聽說MathWorks已經在Matlab R2012b中修復了這個問題。 (但我不再使用Matlab所以不能親自驗證它。)
更新12/09/2014:我再次使用Matlab(R2014b),並且Matlab編譯器現在包括JAR編譯程序的動態類路徑中的動態類路徑。儘管如此,它似乎沒有自動將JAR文件包含在檔案中;您必須使用mcc
命令行開關手動包含它們,或者在Matlab Compiler應用程序中將它們添加爲「附加包含文件」。
+1讓最終用戶修改系統庫不是廣泛部署的可接受解決方案。他們不一定擁有技術知識或文件許可權限,不同的程序可能會使用不同的庫和版本庫,並且會增加環境的差異性。但它看起來像你在這裏的東西。我將嘗試在構建環境中修改靜態類路徑文件足夠長的時間以使其能夠使用導入進行編譯,然後查看它是否會在部署的MCR應用運行時將動態類路徑上的JAR拉出來。 – 2012-02-10 07:52:46
@AndrewJanke,好吧,如果你給他們編譯的應用程序,他們必須安裝MCR,對嗎?所以我不認爲權限是如此重要。至於最終用戶的技術知識,您可以編寫一個小工具來執行一些後期設置,比如說,一個執行所需工作的shell腳本,包括修改基於知識的MCR中的classpath.txt MCR的安裝位置。 – eternaln00b 2012-02-10 13:09:36
另外,請考慮接受我的回答,因爲我相信這在技術上是對您問題的正確答案。 :) – eternaln00b 2012-02-10 13:10:28