windows - Java Attach API: ændre java.library.path dynamisk

Indlæg af Hanne Mølgaard Plasc

Problem



Når jeg bruger API'en com.sun.tools.attach på min Windows-maskine, får jeg følgende fejl, når du ringer til


VirtualMachine.list()


java.lang.UnsatisfiedLinkError: ingen vedhæftet fil i java.library.path


Årsagen er den manglende attach.dll. Attach.dll er placeret i $JRE/bin/. Når jeg starter mit Java-program med -Djava.library.path=[Directory to the attach.dll] fungerer alt uden fejl.


Nu vil jeg ikke tilføje hver Java-program starte denne grimme JVM-parameter. Derfor er mine spørgsmål:



  1. Er min maskine ikke konfigureret rigtigt, og $JRE/bin/ skal alligevel være i bibliotekets sti?

  2. Hvis ikke, hvordan kan jeg tilføje stien dynamisk? System.setProperties("java.library.path",StringOfThePathToTheAttach.dll); trækker ikke ud. Biblioteksstien ændres, men fejlen kommer alligevel. Har dette noget at gøre med SecurityManager eller JVM opstart?


Bedste reference


Din System.setProperty("java.library.path", StringOfThePathToTheAttach.dll); skal fungere. Mit gæt er, at du kalder det for sent. Med andre ord er der et forsøg på at få adgang til DLL'en, før du indstiller ejendommen.


Kan du output den aktuelle værdi for java.library.path, efter at ejendommen er indstillet i kode og igen før det overordnede metodeopkald?


dvs. Hvis du ser 'Før attach.dll call' output før du ser 'Efter indstilling af egenskab', ved du, hvor dit problem er.


Redigere:


En bedre måde at pege på indfødte biblioteker på er at bruge System.load(StringOfThePathToTheAttach.dll) - igen, før den ulovlige linje af kode.

Andre referencer 1


Netop fundet et link, der kan svare på dit spørgsmål


'Java.library.path læses kun en gang, når JVM starter. Hvis du ændrer denne egenskab ved hjælp af System.setProperty, vundet det ikke noget.'


http://fahdshariff.blogspot.jp/2011/08/changing-java-library-path-at-runtime.html[9]

Andre referencer 2


System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + FOLDER\_THAT\_CONTAINS\_ATTACH\_DLL);