2013-01-11 17 views
5

Sto sviluppando e realizzando alcune personalizzazioni su Share. Il mio IDE è Eclipse Juno e area di lavoro è costituito dai seguenti elementi:Come velocizzare lo sviluppo di Alfresco Share

  • progetto fresco web del progetto
  • estensioni Java
  • progetto quota web

Entrambi i progetti web Alfresco e di condivisione vengono distribuiti in istanze Tomcat separate, in questo modo posso velocizzare leggermente le attività di sviluppo riavviando solo l'istanza Tomcat in cui viene distribuita la condivisione.

Le mie estensioni Progetto Java ha la stessa struttura del progetto Eclipse proposto da Alfresco. Y le attività Ant fornite per la compilazione, la compressione di file JavaScript, la creazione di pacchetti e la distribuzione del file JAR risultante in Tomcat.

Sto sviluppando alcuni nuovi widget lato client JavaScript, il che significa che ogni volta che apporto una modifica devo interrompere Tomcat, avviare lo script di build Ant e ricominciare da capo in modo da farlo molto spesso, puoi indovinare che dolore sta diventando. Mi stavo chiedendo se esiste un modo per accelerare le attività di sviluppo su Share. Come lo fa il team di sviluppatori Alfresco? Che tipo di ambiente hanno creato?

Stavo pensando di creare un nuovo obiettivo Ant che distribuisca il contenuto del progetto di estensione in un progetto Web condiviso distribuito, tenendo ovviamente conto dei percorsi; a proposito, quel meccanismo deve consentire l'operazione inversa. Sarebbe fattibile? L'idea sarebbe di avere un meccanismo di distribuzione simile a quello di quando si sviluppano progetti web regolari: quando si apportano modifiche, basta premere il pulsante "Pubblica" e le modifiche vengono inserite nel server.

Vorrei conoscere alcuni suggerimenti e idee, in particolare dal team di sviluppatori Alfresco, se possibile.

PS: Ho già letto https://forums.alfresco.com/en/viewtopic.php?f=47&t=44850 e https://forums.alfresco.com/en/viewtopic.php?f=48&t=18749.

risposta

2

Bene, questa è la soluzione che funziona al 100% come mi aspettavo. Mi sono inventato questo dopo le risposte di @ erik-b e @ jorn-horstmann e prendendo in considerazione alcuni post che ho letto.

Quindi, in pratica ho il prossimo obiettivo Ant, che a caldo distribuisce il contenuto del mio progetto condividono le estensioni Java:

<!-- 
    Hot copy individual files into appropriate deployment folder (e.g. $TOMCAT_HOME/webapps/share) 
--> 
<target name="hotdeploy-tomcat-share" depends="clean, prepare, build-jar" description="Hot copy individual files into appropriate deployment folder (e.g. $TOMCAT_HOME/webapps/share)"> 
    <echo message="Generating and deploying JAR file with custom configuration files" /> 
    <jar destfile="${dist.dir}/${jar.name}"> 
     <!-- Only including configuration XML files such as share-config-custom.xml --> 
     <fileset dir="${build.jar.dir}" includes="**/META-INF/*.xml" /> 
    </jar> 
    <copy todir="${tomcat.share.deployment.path}/WEB-INF/lib"> 
     <fileset file="${dist.dir}/${jar.name}" /> 
    </copy> 

    <echo message="Hot deploying Share files" /> 
    <copy todir="${tomcat.share.deployment.path}/WEB-INF/classes" includeEmptyDirs="false"> 
     <fileset dir="${build.jar.dir}"> 
      <patternset refid="hotdeploy-tomcat-patternset" /> 
     </fileset> 
    </copy> 
</target> 

Auto-ricarico moduli funzione deve essere disabilitato, altrimenti ogni volta che si esegue il sopra il target Ant Tomcat ricaricherà Condividi e altre app Web implementate. Inoltre, credo che sia possibile eseguire l'hot deployment nella directory $ TOMCAT_HOME/shared/ma non l'ho ancora provato.

Il progetto Java che sto utilizzando per lo sviluppo delle mie estensioni è questo progetto modello: http://code.google.com/p/share-extras/wiki/SampleProject. C'è lo script di compilazione completo con gli altri target richiesti.

Sto anche utilizzando questo nella mia quota-config-custom.xml:

<!-- Global config section --> 
    <config replace="true"> 
     <flags> 
     <!-- 
      Developer debugging setting to turn on DEBUG mode for client scripts in the browser 
     --> 
     <client-debug>true</client-debug> 

     <!-- 
      LOGGING can always be toggled at runtime when in DEBUG mode (Ctrl, Ctrl, Shift, Shift). 
      This flag automatically activates logging on page load. 
     --> 
     <client-debug-autologging>false</client-debug-autologging> 
     </flags> 
    </config> 

    <config evaluator="string-compare" condition="WebFramework"> 
     <web-framework> 
     <!-- SpringSurf Autowire Runtime Settings --> 
     <!-- 
       Developers can set mode to 'development' to disable; SpringSurf caches, 
       FreeMarker template caching and Rhino JavaScript compilation. 
     --> 
     <autowire> 
      <!-- Pick the mode: "production" or "development" --> 
      <mode>development</mode> 
     </autowire> 

     <!-- Allows extension modules with <auto-deploy> set to true to be automatically deployed --> 
     <module-deployment> 
      <mode>manual</mode> 
      <enable-auto-deploy-modules>true</enable-auto-deploy-modules> 
     </module-deployment> 
     </web-framework> 
    </config> 

L'ultimo frammento di XML evita di aggiornare webscripts dopo ogni modifica effettuata su una pagina FTL, per esempio.

Ho anche eseguito alcuni test con JRebel ma dopo la mia esperienza direi che non aiuta molto nello sviluppo di Share.

C'è anche roba interessante nei prossimi articoli:

http://blogs.alfresco.com/wp/kevinr/2010/04/07/developer-tips-for-alfresco-share-33/

http://techblog.zabuchy.net/2012/debugging-javascript-in-alfresco/

Speranza che aiuta gli altri.

7

Due cose che accelera le cose molto:

  • Investire in una licenza jrebel per la classe ricarico senza riavvio del server http://zeroturnaround.com/software/jrebel/

  • Costruire compiti formica che copiano webscripts alle webscripts cartella di destinazione e ricarica con arricciatura se necessario.

Esempio di un compito che ricarica un'Alfresco Share webscript:

<target name="deploy-share-webscripts" depends="Share: Copy files" description="Refreshes the list of webscripts"> 
    <exec executable="curl"> 
    <arg value="-d"/> 
    <arg value="reset=on"/> 
    <arg value="http://admin:[email protected]${share.web.url}/page/console?reset=webscripts"/> 
    </exec> 
</target> 

Aggiunta la parte copia del compito formica (SRC-dirs sono dichiarate come proprietà nella inizio della BuildFile):

<echo message="- Copying java classes" /> 
    <copy todir="${warWebappTargetClasses}" overwrite="false" verbose="true"> 
     <fileset dir="${warTargetJavaDir}" /> 
    </copy> 

    <echo message="- Copying resource files" /> 
    <copy todir="${warWebappTargetClasses}" overwrite="false" verbose="true"> 
     <fileset dir="${warSrcResourcesDir}" > 
      <include name="**/model/*"/> 
      <include name="**/templates/**/*"/> 
      <include name="**/custom-model-context.xml"/> 
      <include name="**/web-client-config-custom.xml"/> 
      <include name="**/webclient.properties"/> 
      <include name="**/aka-model-resourcebundle*"/> 
      <include name="log4j.properties"/> 
     </fileset> 
    </copy> 

    <echo message="- Copying resource files from amp into war for quick deployment." /> 
    <copy todir="${warWebappTargetClasses}" overwrite="false" verbose="true"> 
     <fileset dir="${projectAmpResourcesSrcDir}" /> 
     <fileset dir="${projectAmpClassesDir}" /> 

     <fileset dir="${listmanagerAmpResourcesSrcDir}" /> 

    </copy> 

    <echo message="- Copying config files from amp into war for quick deployment." /> 
    <copy todir="${warWebappTargetClasses}\alfresco\module\Project-amp\" overwrite="false" verbose="true"> 

     <fileset dir="${projectAmpConfigSrcDir}" /> 


    </copy> 
</target> 

io uso il ciclo di vita Maven all'aperto http://wiki.alfresco.com/wiki/Managing_Alfresco_Lifecyle_with_Maven per la mia messa a punto, che accelera anche le cose. Sono sicuro che molto può essere aggiunto a questo argomento.

+0

Oltre al ricaricamento della classe (che per me è meno importante in questa fase), ciò che intendi è creare un'attività Ant che copia le risorse di estensione nella cartella di distribuzione di Share all'interno di Tomcat, sbaglio? Ad esempio, le risorse lato client verrebbero copiate in ** tomcat/webapps/share/WebContent/my_resources_folder /...**, o una pagina personalizzata in ** tomcat/webapps/share/WebContent/WEB-INF/classes/alfresco /site-data/pages/my_custom_page.xml**. Se è ciò che intendi, hai un esempio di tale compito Ant? :) –

+0

Ok, ho aggiunto la parte di copia alla mia risposta, poiché la formattazione del codice nella sezione dei commenti non era ideale ... – billerby

+0

Un'altra domanda @ erik-b, quando parli di "cartella di destinazione" cosa intendi esattamente? –

3

È possibile evitare di copiare i webscripts sul tomcat configurando percorsi aggiuntivi per il classloader condiviso di tomcats. Questa è un'impostazione in tomcat/conf/catalina.properties.L'ho impostato direttamente nella directory dei sorgenti dei progetti, quindi non è necessario il passo di compilazione.

shared.loader=${catalina.home}/shared/classes,${catalina.home}/shared/lib/*.jar,\ 
/path/to/my/dashlet/src/main/resources,\ 

devo anche le seguenti impostazioni in shared/classes/alfresco/web-extension/share-config-custom.xml per consentire l'aggiornamento automatico di modelli e webscripts.

<alfresco-config> 
    <!-- Global config section --> 
    <config replace="true"> 
     <flags> 
      <!-- Developer debugging setting - DEBUG mode for client scripts in the browser --> 
      <client-debug>true</client-debug> 

      <!-- LOGGING can be toggled at runtime when in DEBUG mode (Ctrl, Ctrl, Shift, Shift). 
       This flag automatically activates logging on page load. --> 
      <client-debug-autologging>false</client-debug-autologging> 
     </flags> 
    </config> 

    <config evaluator="string-compare" condition="WebFramework"> 
     <web-framework> 
      <!-- Autowire Runtime Settings --> 
      <autowire> 
       <!-- 
        Developers can set mode to 'production' or 'development' (to disable; SpringSurf caches, 
        FreeMarker template caching and Rhino JavaScript compilation.) 
       --> 
       <mode>development</mode> 
      </autowire> 
     </web-framework> 
    </config> 
</alfresco-config> 
+0

Per quanto ho capito, questo è più relativo allo sviluppo di webscripts lato server (correggimi se ho torto).La mia domanda era più concentrata sulle risorse lato client come i widget JavaScript. Comunque ciò che hai fornito è molto utile e lo incorporerò al mio ambiente di sviluppo. Grazie. –

+0

@ AlejandroGarcíaSeco: Almeno per i dashlet, la parte sul lato client è anche contenuta nel jar e quindi è disponibile sul classpath. L'impostazione del classloader condiviso nella directory di origine elimina la necessità di copiare e impacchettare. Non sono sicuro che la seconda parte della mia risposta sia necessaria nel tuo caso, potrebbe anche essere che disabiliti alcune cache delle risorse del classpath. –

+0

Ho provato il tuo suggerimento ma sfortunatamente non funziona correttamente per me. Sto avendo delle eccezioni quando il contesto Spring è inizializzato come per alcuni valutatori personalizzati, ho cercato di risolverlo ma non sono stato in grado di trovare una soluzione diretta. Ci riproverò ancora perché non posso passare più tempo su questo ora. Grazie mille. –

1

Di solito lavoro su istanze private, quindi posso permettermi di eseguire app esplose, quindi qualsiasi modifica è immediatamente visibile per me. Ho solo bisogno di riavviare Tomcat quando cambio il datamodel, distribuisco alcuni nuovi moduli java backed o webscripts o simili. Anche se alcuni di questi possono essere ricaricati anche dal vivo.

Problemi correlati