Avatar billede dennism Nybegynder
11. april 2010 - 13:48 Der er 8 kommentarer og
1 løsning

Java med Plugin

Jeg sidder og udvikler på et projekt i Java. Det køres fra en .jar-fil. Som input på vores program, kan brugeren f.eks. indtaste navnet på en algoritme, som skal udføres på nogle grafer under programkørsel. Det kunne f.eks. være "dijkstra".
Da programmet hovedsageligt handler om fremstilling af grafer, er algoritmerne ikke implementeret i programmet. Derfor er jeg interesseret i, at brugerne selv kan implementere nogle algoritmer, som kan udføres på graferne på runtime i programmet. Vores jar-fil indeholder et interface som definerer, hvilke metoder en algoritme har. Dvs. jeg gerne vil lave et slags plugin i Java-kode til programmet.

I grove træk, kunne det f.eks. være følgende filstruktur:
- program.jar
- input.txt
- algo/dijkstra.class

Når program.jar så kører indlæser den input.txt hvor den f.eks. finder "run dijkstra on graph ..." og dermed skal den forsøge at indlæse algo/dijkstra.class på runtime og bruge dens metoder fra interfacet på den pågældende graf.

Jeg har f.eks. fundet et eksempel her:
http://www.exampledepot.com/egs/java.lang/LoadClass.html
Der kan jeg sagtens få loadet klassen, men den bliver kun oprettet som typen "Class" og dermed er den ikke til at arbejde med. Jeg kan ikke typecaste det til mit interface.

Nogen der har et bud på, hvordan man kan klare dette - eller noget lignende? Skulle det f.eks. være nemmere, hvis algoritmerne også ligger i en jar, så er det fint med mig.

På forhånd tak.
Avatar billede arne_v Ekspert
11. april 2010 - 15:04 #1
Du kan sagtens caste den til dit interface.

Men for at du kan bruge interfacet så skal det være defineret i din kode
Avatar billede arne_v Ekspert
11. april 2010 - 15:06 #2
URL[] url = new URL[] { new URL("url-for-din-plugin-jar-fil") };
URLClassLoader cl = new URLClassLoader(url);
(DitInterfaceIDitHovedProgram) o = (DitInterfaceIDitHovedProgram)Class.forName("class-name-der-skal-loades-fra-din-plugin-jar-fil", true, cl).newInstance();
Avatar billede arne_v Ekspert
11. april 2010 - 15:07 #3
Hvis du har brug for en meget avanceret plugin model (med vesrions styring etc.), så kig på OSGi !
Avatar billede dennism Nybegynder
11. april 2010 - 15:39 #4
Tak for dit svar - jeg forsøger mig lige ad. Faldt dog også over dette, som måske også kan bruges:
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html

Jeg har lige et problem i denne sammenhæng, som du sikkert kan hjælpe mig med.
Jeg står i en mappe, som indeholder følgende:
- program.jar
- test/Tester.java

program.jar indeholder bl.a. mit interface, som test/Tester.java implementerer. Normalt bruger jeg bare eclipse og så kan jeg godt få det til at compile. Men hvordan skal jeg køre javac, for at få den til at compile test/Tester.java med brug af program.jar som resource?

Jeg har forsøgt mig med f.eks.:
javac -cp program.jar test/Tester.java

Men så får jeg bare at vide, at den ikke kan finde mit interface.
Avatar billede arne_v Ekspert
11. april 2010 - 15:44 #5
Hvis interfacet ligger som det skal i jar filen, så burde det være nok ar tilføje jar filen til classpath for javac kommandoen.
Avatar billede arne_v Ekspert
11. april 2010 - 15:45 #6
Prøv lige at check om jar filen er OK med:

jar tvf program.jar

og post den fulde fejl meddelelse
Avatar billede dennism Nybegynder
11. april 2010 - 15:57 #7
Jeg fandt problemet, som skyldes en package fejl.

Jeg prøver lige at lege videre med ClassLoaderen - og så vender jeg lige tilbage.

På forhånd mange tak for hjælpen!
Avatar billede dennism Nybegynder
23. april 2010 - 17:39 #8
Vil du smide et svar?
Tak for hjælpen!
Avatar billede arne_v Ekspert
23. april 2010 - 17:41 #9
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester