venerdì 22 marzo 2013

Compilare plugin PMD

Compilare plugin PMD

I sorgenti si trovano qui: https://github.com/pmd/pmd/tree/master/pmd-eclipse-plugin

Ant

Non sono riuscito a compilare con ANT. Hoprovato a modificare i lfile di build  build.xml con le impostazioni del mio sistema (cioè dei plugin installati in C:\Program Files\Java\eclipse-jee-juno-win32\eclipse\plugins ), modificando le properties:



7    <property name="eclipse.home" value="C:/Program Files/Java/eclipse-jee-juno-win32/eclipse"/>
8    <property name="eclipse.pde.version" value="3.8.0.v20120523-1555"/>
9  
10  <property name="eclipse.launcher.version" value="1.3.0.v20120522-1813"/>


ma ottengo sempre il seguente errore:


[java] generateScript:
 [java]
 [java] BUILD FAILED
 [java] [eclipse.buildScript] Some inter-plug-in dependencies have not been satisfied.
 [java] C:\Program Files\Java\eclipse-jee-juno-win32\eclipse\plugins\org.eclipse.pde.build_3.8.0.v20120523-1555\scripts\build.xml:35: The following error occurred while executing this line:
 [java] [eclipse.buildScript] Bundle net.sourceforge.pmd.eclipse.plugin:
 [java] C:\Program Files\Java\eclipse-jee-juno-win32\eclipse\plugins\org.eclipse.pde.build_3.8.0.v20120523-1555\scripts\build.xml:91: The following error occurred while executing this line:
 [java] [eclipse.buildScript]       Another singleton version selected: net.sourceforge.pmd.eclipse.plugin_4.0.0.201211080927
 [java] C:\Program Files\Java\eclipse-jee-juno-win32\eclipse\plugins\org.eclipse.pde.build_3.8.0.v20120523-1555\templates\headless-build\customTargets.xml:12: The following error occurred while executing this line:
 [java] C:\Program Files\Java\eclipse-jee-juno-win32\eclipse\plugins\org.eclipse.pde.build_3.8.0.v20120523-1555\templates\headless-build\allElements.xml:16: The following error occurred while executing this line:
 [java] C:\Program Files\Java\eclipse-jee-juno-win32\eclipse\plugins\org.eclipse.pde.build_3.8.0.v20120523-1555\scripts\genericTargets.xml:111: Unable to find feature: net.sourceforge.pmd.eclipse.
 [java]
 [java] Total time: 8 seconds
 [java] An error has occurred. See the log file
 [java] C:\Users\Duccio\workspace\.metadata\.log.
BUILD FAILED
C:\Users\Duccio\Lavori\PMDPlugin\pmd-pmd-5.0.x\pmd-eclipse-plugin\build.xml:47: Java returned: 13
Total time: 16 seconds

Dopo alcune ricerche e tentativi, post su forum: 
http://sourceforge.net/p/pmd/discussion/188194/thread/3dd4adf9/
https://sourceforge.net/p/pmd/discussion/188194/thread/3dd4adf9/?limit=25#b53a/83b8

ho lasciato perdere e ho provato a compilare il tutto con Eclipse


Eclipse

Anche in questo caso c'è da fare alcune modifiche ma alla fine sono riuscito a compilare.
Per importare i file in eclipse ho seguito le indicazioni del readme:


Importing the projects in Eclipse
=================================

In the Java perspective, select "Import" -> "Existing Java projects", select
the directory where this file is located.  The next panel should have four
projects:

net.sourceforge.pmd.eclipse
net.sourceforge.pmd.eclipse.plugin
pmd-eclipse-test
pmd-eclipse-test-fragment

Dopo occorre:


- In net.sourceforge.pmd.eclipse.plugin\META-INF\MANIFEST.MF tolto riferimento a org.eclipse.help.appserver secondo quanto descritto qui:
http://www.eclipse.org/eclipse/development/porting/4.2/incompatibilities.html

- Modificato in pmd-eclipse-plugin\features\net.sourceforge.pmd.eclipse\feature.xml la versione di net.sourceforge.pmd.eclipse, sostituendo 5.0.0.v20100826 a  5.0.0.v200810141040

- In pmd-eclipse-plugin\features\net.sourceforge.pmd.eclipse\build.properties "Versions" "Copy Versions"

- pmd-eclipse-plugin\pmd-eclipse-test\plugin.xml

In questo modo si dovrebbe compilare e esportare in modalità "deployable feature".
in questo modo si ottengono due folder "plugins" "features" che andranno copiate nella cartella eclipse_home (ad es. C:\Program Files\Java\eclipse-jee-juno-win32\eclipse\dropins).
Per maggiore ordine si può introdurre una cartella "pmd" dentro la  dropin:
C:\Program Files\Java\eclipse-jee-juno-win32\eclipse\dropins\pmd.
Fatto questo si riavvia eclipse e il gioco è fatto.
Per disinstallare il plugin basta cancellare le cartelle inserite e riavviare eclipse.
E' tutto qui :)

Per installare insieme al plugin una versione modificata di pmd, occorre ricompilare pmd con le modifiche.
ATTENZIONE! il plugin è stato compilato con una versione vecchia del plugin, dovrebbe essere la versione  5.0-SNAPSHOT, se si prova a compilare con una versione recente, ad esempio la 5.1.0 si ha un errore in quanto il plugin cerca di usare delle classi che nelle nuove versioni di PMD non sono più presenti.
Ci troviamo quindi davanti a due opzioni: modificare il plugin per renderlo compatibile con le ultime versioni di pmd, oppure recuperare la versione di pmd usata per compilare il plugin e modificare quella.
Io ho optato per la seconda strada, in quanto mi sembrava più veloce.

La versione di pmd "5.0-SNAPSHOT" si trova in github, ma non mi è chiaro a quale commit corrisponda.
Credo si tratti di SHA1: d54a66857c33c0859a1881f90a97fa4e272e79c3

Per recuperare questa versione occorre installare il client github, ad esempio Git-Gi (http://www.ohloh.net/p/git-gui).
Una volta installato si fa un clone del repositori pmd da https://github.com/pmd/pmd.git su un repository locale sulla propria macchina.
A questo punto abbiamo in locale tutta la storia dei commit di tutto il progetto.Andando a ritroso nel tempo fino al 31 gennaio 2012 si arriva appunto alla versione che mi sembra quella usata per compilare il plugin.

A questo punto si fa un "crea ramo" specificando il SHA1 opportuno, così nel repository locale si dovrebbe recuperare i sorgenti ricercati. Compilandoli con mvn package si dovrebbe ottenere pmd-5.0-SNAPSHOT.jar.

QUesto jar va copiato nella cartella lib del progetto eclcipse con cui si vuole compilare il plugin, dopodichè va aggiunto al build path delle referenced library nel package explorer di eclipse. Questa operazione va fatta specificando che il jar deve essere locale e non esterno al progetto, nell'elenco dei jar nel package explorer non deve comparire il path in cui si trova, ma deve comparire come tutti gli altri senza path. Sono arrivato a questo risultato solo dopo diversi tentativi, chiudendo e riaprendo eclipse e non so con esattezza quale sia la procedura corretta.

ATTENZIONE, in origine il jar si chiamava solo pmd-5.0.jar e anche in META-INF/MANIFEST.MF è indicato con questo nome, ho l'impressione che vada modificato il file assegnando il nuovo nome del .jar.

Facendo tutto ciò, lanciando la compilazione da eclipse.. nella cartella bin del progetto si dovrebbero trovare le classi compilate.

__________________________________________________________________
che genererà il nuovo .jar. Ad esempio:
- nel package package net.sourceforge.pmd.lang.java.rule.codesize si copia il file ExcessiveClassLengthRule.java e lo si rinomina in ClasseTroppoLungaRule.java.
Si rinomina il nome della classe e del costruttore e si salva.
- In src\main\resources si modifica l ruleset codesize.xml aggiungendo una descrizione anche per ClasseTroppoLungaRule e si salva.
- Si modifica artifactId in pom.xml, ad esempio impostandolo a pmdDuccius e si salva
Se non ci sono problemi dentro la cartella target del progetto si dovrebbe trovare il file pmdDuccius-5.0.0.jar.
- questo va aggiunto alla cartella lib del progetto del plugin e nel progetto la si aggiunge alle referenced libraries
- si elimina la vecchia pmd 5.0.0



Nessun commento: