2013-05-03 14 views
9

MATLAB jest skonfigurowany do przeszukiwania swojej statycznej ścieżki do klasy java przed przeszukaniem ścieżki dynamicznej modyfikowalnej przez użytkownika. Niestety, ścieżka statyczna zawiera całkiem sporo bardzo starych bibliotek publicznych, więc jeśli spróbujesz użyć nowej wersji, może się skończyć ładowaniem niewłaściwej implementacji i otrzymaniem błędów.Najlepszy sposób na przesłonięcie domyślnej statycznej jailaclasspath MATLABa

Na przykład ścieżka statyczna zawiera starą kopię pliku google-collections.jar, która od dawna została wyparta przez bibliotekę guawy Google i która ma niektóre z tych samych nazw klas (np. Com.google.common.base. Obiekty). W rezultacie, jeśli wywołasz metodę Guava, która używa nowszej metody jednej z takich klas, otrzymasz zaskakujące NoSuchMethodErrors, ponieważ jar Google-collections zostanie znaleziony jako pierwszy.

Od R2012b, MATLAB pozwala na określenie dodatkowych słoików do dodania do statycznej ścieżki poprzez umieszczenie pliku javaclasspath.txt w folderze preferencji, ale to dodaje słoiki na końcu ścieżki i nie pozwala na przesłonięcie słoiki wbudowane w MATLAB.

Jaki jest najlepszy sposób obejścia tego?

Odpowiedz

2

Jeden z hacków, który wydaje się działać, to dodanie słoika na początek pliku classpath.txt, który można znaleźć w przyborniku instalacyjnym MATLAB/folderze lokalnym. Niestety jest to automatycznie generowane i może zostać przepisane w nieokreślonym czasie, na przykład podczas instalowania nowych zestawów narzędzi, więc takie podejście wymagałoby zauważenia, kiedy to nastąpi, i ponownego zastosowania hackowania.

+1

Nie mogę myśleć w inny sposób, chociaż ryzykujesz problemy ze zgodnością, jeśli będziesz bałagan z zestawem plików JAR, które MATLAB ładuje do własnego użytku. – Amro

+1

Tak, obawiam się, że to może być jedyny sposób obejścia tego. Matlab nie wydaje się używać programu ładującego klasy kontekstu wątku, więc nadpisuje, że nic nie zrobi. Naprawdę, powinni znaleźli sposób wyizolowania ich użycia tych słoików ze ścieżki modułu ładującego klasy używanej przez dostarczony przez użytkownika kod Java, ale jasne jest, że uzyskanie tego rodzaju poprawnych rzeczy nie jest dziedziną kompetencji Mathworks. –

+1

@ChristopherBarber: Jasne jest, że poprawianie tego typu rzeczy nie jest jednym z obszarów kompetencji społeczności programistów Java. JSR 277 nie żyje, Project Jigsaw został wyparty _again_ do Javy 9, a OSGi jest dość skomplikowany i pracowity, by trzymać się czegoś takiego jak Matlab. Jeśli deweloperzy Java mają problemy z budowaniem systemu modułów, trudno jest winić Mathworks, że nie robi tego za nich. –

10

dostałem oficjalną odpowiedź z Mathworks:

Od MATLAB R2013a (także w R2012b), zajęcia mogą być dodawane do przodu statycznej ścieżce klasy Java przy tym następujący wiersz w javaclasspath.txt:

<before> 

Dowolny katalog, który znajduje się po tym wierszu w pliku javaclasspath.txt zostanie dodany z przodu statycznej ścieżki klasy Java. Jest to nieudokumentowane użycie javaclasspath.txt od wersji R2013a.

Ale ogólnie w MATLAB, możliwość dodawania klas z przodu statycznej ścieżki klasy Java nie jest dostępna przez javaclasspath.txt w MATLAB 8.0 (R2012b).

wyszukiwania MATLAB dla classpath.txt w następującej kolejności:

  1. W katalogu startowym. Od wersji MATLAB 8.0 (R2012b) pojawi się ostrzeżenie, jeśli plik zostanie znaleziony i zostanie zignorowany.

  2. W pierwszym katalogu zmiennej środowiskowej MATLABPATH. (Ta zmienna środowiskowa jest używana w skrypcie powłoki bin/matlab w systemie Linux i ogólnie nie jest używana przez użytkownika końcowego).

  3. W przyborniku/katalogu lokalnym.

Chociaż zmienna MATLABPATH pkt 2 nie jest zazwyczaj używany przez użytkowników końcowych, możemy użyć go w celu obejścia tego problemu, aby umożliwić czytanie niestandardową classpath.txt poza katalogiem przybornika/lokalnym.

W systemie Windows:

Trzeba będzie utworzyć zmienną środowiskową MATLABPATH. Pierwszy katalog powinien być katalogiem z niestandardową ścieżką klas.txt ORAZ będziesz także musiał dodać toolbox \ local directory jako drugą opcję. Więc z cmd poprosi można zrobić:

zestaw MATLABPATH = C: \ Users \ user \ Documents \ myMATLABClasspath; c: \ Program Files \ MATLAB \ R2012b \ toolbox \ Local matlab.exe

+0

Myślę, że brakuje ci czegoś w odpowiedzi. Jaką linię powinniśmy dodać do pliku 'javaclasspath.txt'? – Amro

+0

Linia to: chriswynnyk

+1

Prawdopodobnie ten nowy hack cierpi z powodu takiego samego ryzyka przypadkowego uszkodzenia wewnętrznego wykorzystania tych słoików przez MATLAB, ale jest to lepsze niż zhakowanie wewnętrznego pliku klasy classpath. Jednakże, jeśli musisz wspierać użytkowników używających wielu różnych wersji MATLAB, to ten nowy hack naprawdę nie pomaga tak bardzo. –

1

W przypadku dystrybucji słoika, który ma być używany z programem Matlab, może być lepiej użyć programu proguard, jak opisano w artykule http://code.google.com/p/guava-libraries/wiki/UsingProGuardWithGuava.

Jeśli określisz, że wszystkie twoje klasy i ich (publiczne) pola i metody mają zostać zachowane i zawierają guawę jako słoik programu (nie bibliotekę), to zmienią nazwę wszystkich metod guawy i zaktualizują skompilowany kod bajtowy w odniesieniu do nowych nazw.

Wygląda na nieco hackish, ale w zależności od odbiorców może być znacznie łatwiejsze niż uczenie użytkowników o statycznej vs dynamicznej ścieżce klas, i nie złamie żadnego kodu matlab, który zależy od starego zachowania.

Powiązane problemy