MATLAB est configuré pour rechercher son chemin de classe Java statique avant de rechercher le chemin dynamique modifiable par l'utilisateur. Malheureusement, le chemin statique contient un certain nombre de bibliothèques publiques très anciennes. Si vous essayez d'utiliser une nouvelle version, vous pouvez finir par charger la mauvaise implémentation et obtenir des erreurs. p>
Par exemple, le chemin statique contient une copie ancienne du Google-Collections.jar, qui a longtemps été supplanté par la bibliothèque Guava de Google et qui possède certains des mêmes noms de classe (par exemple, com.google.common.base.Objects ). En conséquence, si vous invoquez une méthode de goyave qui utilise une nouvelle méthode de l'une d'une telle classe, vous finirez par obtenir surprenant noschmethoderrors car le pot de collections Google-Collections se trouve en premier. P>
AS de R2012B, MATLAB vous permet de spécifier des pots supplémentaires à ajouter au chemin statique en mettant un fichier JavaclassPath.txt dans votre dossier Préférences, mais qui ajoute des pots à la fin du chemin et ne vous permet pas de remplacer les pots qui sont intégrés à Matlab. p>
Alors, quel est le meilleur moyen autour de cela? P>
4 Réponses :
Un piratage qui semble fonctionner est d'ajouter le pot en haut du fichier de classePath.txt trouvé dans votre boîte à outils d'installation MATLAB / Dossier local. Malheureusement, cela est généré automatiquement et peut être réécrit à une heure non spécifiée, par exemple lorsque vous installez de nouvelles boîtes à outils, cette approche vous obligerait donc à avoir une bonne façon de remarquer quand cela se produit et réapplique le hack. P>
Je ne peux pas penser à une autre manière, bien que vous risquiez de risquer des problèmes de compatibilité si vous vous déconnectez avec l'ensemble de fichiers JAR, Matlab est chargé de son usage propre.
Oui, je crains que cela ne soit le seul moyen de voir cela. Matlab n'apparaît pas utiliser le chargeur de classe de contexte de fil, alors il ne fait rien faire. Vraiment, ils auraient dû trouver un moyen d'isoler leur utilisation de ces pots à partir du chemin de la classe Chargeuse utilisé par le code Java fourni par l'utilisateur, mais il est clair que ce type de chose n'est pas un droit de la compétence de Mathworks.
@Christophalerbarber: Il est clair que ce genre de chose n'est pas l'un des domaines de compétence de la communauté de développement Java. JSR 277 est mort, le projet Jigsaw a été repoussé à nouveau I> à Java 9, et Osgi est plutôt complexe et entreprises à coller quelque chose comme Matlab. Si les propres développeurs de Java ont du mal à construire un système de module, il semble difficile de blâmer Mathworks pour ne pas le faire pour eux.
Oui, Java ne fait pas un excellent travail à ce sujet, non plus mais Matlab est beaucoup i> pire. Au moins, Java a un concept de packages et de chargeuses de classe, où Matlab n'a vraiment aucun système de module. De plus, Matlab coûte beaucoup d'argent mais Java est gratuit.
J'ai une réponse officielle de Mathworks:
AS de MATLAB R2013A (également dans R2012B), des classes peuvent être ajoutées à l'avant du chemin de classe Java statique en incluant la ligne suivante dans JavaclassPath.txt: P >
<before>
Je pense que vous manquez quelque chose dans votre réponse .. Quelle ligne devrions-nous ajouter à java classPath.txt code> fichier?
Vraisemblablement, ce nouveau hack souffre du même risque d'utiliser accidentellement l'utilisation interne de ces bocaux de Matlab, mais c'est mieux que d'avoir à pirater le fichier de classe interne. Toutefois, si vous devez prendre en charge les utilisateurs en utilisant de nombreuses versions différentes de Matlab, ce nouveau hack ne vous aide pas vraiment tout cela.
Ah, j'aurais dû savoir que c'était une chose de formatage HTML :) Merci Chriswynnyk. @Christophalerbarber: Je viens de me souvenir d'une autre idée que j'ai vue ailleurs; essayez d'utiliser ce outil de classePathhacker (il utilise la réflexion sur l'encapsulation de contournement du urlclassloader code> classe) .. Vous pouvez Ensuite, utilisez ce code pour vérifier quelle version est utilisée
@Amro: Fyi, j'ai mis en place une version de code M de la classePathhacker sur Stackoverflow.com/a/22524112/105904. Il y a quelques problèmes utilisant le piratage statique de classe de classe à Matlab; En particulier, la sortie JavaclassPath () ne reflète pas les changements. Je vais bug-le signaler à Mathworks.
@Andrewjanke: Cela devrait faciliter l'utilisation du hack dans Matlab. Merci d'avoir partagé le code.
Il n'y a pas de fichier JavaclassPath.txt. Voulez-vous dire un fichier de classePath.txt?
Si vous distribuez un pot qui est destiné à être utilisé avec MATLAB, il peut être préférable d'utiliser PROGUARD comme décrit à http://code.google.com/p/guava-libries/wiki/usingProguardwithguava . P>
Si vous spécifiez que toutes vos classes et leurs champs et méthodes (publiques) doivent être préservés et incluent GUAVA en tant que pavillon de programme (pas une bibliothèque), il renommera toutes les méthodes de Guava et mettra à jour votre bytecode compilé à Référencez les nouveaux noms. P>
Cela semble un peu pirate, mais en fonction du public, il peut être nettement plus facile que d'enseigner à vos utilisateurs de statistiques et de dynamiques de classe de classe, et il ne casse aucun code MATLAB qui dépend de l'ancien comportement. P >
Au lieu d'obscurcir l'emballage comme suggéré par @ user2443532, j'ai trouvé qu'il est plus facile de "ombre" du package contradictoire au lieu de l'obscurcir - sauf si vous n'avez pas besoin d'obscurcissement. Un moyen facile de le faire est de construire votre colis à l'aide de Maven et d'utiliser le plug-in Les appels directs de Matlab devront être modifiés - par exemple, des appels vers Pour plus d'informations sur l'ombrage, voir Quel est le plug-in Maven-Shade utilisé et pourquoi voudriez-vous déplacer des paquets Java? P> Maven-Shade Code>. Les appels internes sont modifiés automatiquement, de sorte que vous n'avez pas besoin de modifier l'un des codes Java. P>
com.opensource.class code> deviennent
ombreux.com.opensource.class code>. p>.