2013-01-11 5 views
5

Ich entwickle und führe einige Anpassungen auf Share. Meine IDE Eclipse ist Juno und Arbeitsbereich besteht aus den folgenden Elementen:So beschleunigen Sie die Entwicklung von Alfresco Share

  • Alfresco Web-Projekt
  • Erweiterungen Java-Projekt
  • Aktien Webprojekt

Beide unter freiem Himmel und mit anderen teilen Web-Projekten eingesetzt werden In separaten Tomcat-Instanzen kann ich so meine Entwicklungsaufgaben etwas beschleunigen, indem ich nur die Tomcat-Instanz neu starte, in der Share implementiert ist.

Mein Java-Erweiterungsprojekt hat dieselbe Struktur wie das von Alfresco vorgeschlagene Eclipse-Projekt. Y die bereitgestellten Ant-Tasks zum Kompilieren, Komprimieren von JavaScript-Dateien, Packen und Bereitstellen der resultierenden JAR-Datei in Tomcat.

Ich entwickle einige neue clientseitige JavaScript-Widgets, was bedeutet, dass ich jedes Mal, wenn ich etwas ändere, Tomcat stoppen, Ant Build-Skript starten und erneut starten muss, da ich es sehr oft tun muss Was für ein Schmerz wird es werden. Ich habe mich gefragt, ob es eine Möglichkeit gibt, Entwicklungsaufgaben bei Share zu beschleunigen. Wie machen die Entwickler von Alfresco das? Welche Art von Umgebung richten sie ein?

Ich habe überlegt, ein neues Ant-Ziel zu erstellen, das den Inhalt des Erweiterungsprojekts in das bereitgestellte Share-Webprojekt implementiert, wobei natürlich Pfade berücksichtigt werden; Dieser Mechanismus muss übrigens den umgekehrten Vorgang ermöglichen. Wäre das machbar? Die Idee wäre, einen ähnlichen Bereitstellungsmechanismus wie beim Entwickeln regulärer Webprojekte zu haben: Wenn Sie eine Änderung vornehmen, drücken Sie einfach die Schaltfläche "Veröffentlichen" und die Änderungen werden in den Server eingetragen.

Ich würde gerne einige Tipps und Ideen, speziell von Alfresco-Entwickler-Team, wenn möglich.

PS: Ich habe bereits https://forums.alfresco.com/en/viewtopic.php?f=47&t=44850 und https://forums.alfresco.com/en/viewtopic.php?f=48&t=18749 gelesen.

Antwort

2

Nun, das ist die Lösung, die 100% funktioniert, wie ich erwartet habe. Ich habe das nach den Antworten von @ erik-b und @ jorn-horstmann und unter Berücksichtigung einiger Beiträge, die ich gelesen habe, herausgefunden.

Also im Grunde habe ich das nächste Ant-Ziel, die den Inhalt meiner Teile Erweiterungen Java-Projekt heiß setzt:

<!-- 
    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-Nachladen Module verfügen muss deaktiviert werden, da sonst jedes Mal, wenn das oben Ant-Ziel ausführen Tomcat lädt Share und andere Web-Apps neu. Außerdem glaube ich, dass es auch möglich ist, im Verzeichnis $ TOMCAT_HOME/shared/hot zu deployen, aber ich habe es noch nicht ausprobiert. Das Java-Projekt, das ich für die Entwicklung meiner Erweiterungen verwende, ist dieses Modellprojekt: http://code.google.com/p/share-extras/wiki/SampleProject. Es ist das vollständige Build-Skript mit den anderen erforderlichen Zielen.

Ich verwende diese auch in meinem Anteil-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> 

Der letzte XML-Schnipsel webscripts nach jeder Änderung auf einer FTL Seite ausgeführt aufzuzufrischen vermeidet, zum Beispiel.

Ich habe auch einige Tests mit JRebel durchgeführt, aber nach meiner Erfahrung würde ich sagen, dass es in der Share-Entwicklung nicht viel hilft.

Es gibt auch interessante Dinge in den nächsten Artikel:

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

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

Hoffe, dass es anderen hilft.

7

zwei Dinge, die Dinge beschleunigt viel:

  • Invest in einer JRebel Lizenz für Klasse Nachladen ohne Neustart des Servers http://zeroturnaround.com/software/jrebel/

  • Ameise Aufgaben konstruieren, die webscripts den Zielordner und Reloads webscripts kopieren mit Locke wenn nötig.

Beispiel für eine Aufgabe, die einen Alfresco Share WebScript neu geladen:

<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> 

das Kopieren Teil des Ant-Task Anfügen (der src-dirs wird als Objekte im Anfang des Buildfile angegeben):

<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> 

ich verwende den maven im Freien Lifecycle http://wiki.alfresco.com/wiki/Managing_Alfresco_Lifecyle_with_Maven für meinen Setup, die auch Dinge beschleunigt. Ich kann sicher viel zu diesem Thema hinzufügen.

+0

Abgesehen von dem Neuladen der Klasse (was für mich in diesem Stadium weniger wichtig ist), meinen Sie eine Ant-Task, die Erweiterungsressourcen in Tomats Share Deployment-Ordner kopiert, habe ich mich geirrt? Beispielsweise werden clientseitige Ressourcen in ** tomcat/webapps/share/WebContent/my_resources_folder /...** oder eine benutzerdefinierte Seite in ** tomcat/webapps/share/WebContent/WEB-INF/classes/alfresco kopiert /site-data/pages/my_custom_page.xml. Wenn es das ist, was Sie meinen, haben Sie ein Beispiel für eine solche Ant-Aufgabe? :) –

+0

Ok, habe den Copy Teil zu meiner Antwort hinzugefügt, da die Code Formatierung im Kommentarbereich nicht ideal war ... – billerby

+0

Noch eine Frage @ erik-b, wenn du über "Zielordner" sprichst was genau meinst du? –

3

Sie können das Kopieren der Webskripte auf den Tomcat vermeiden, indem Sie zusätzliche Pfade für den freigegebenen Klassenlader von tomcats konfigurieren. Dies ist eine Einstellung in tomcat/conf/catalina.properties.Ich setze dies direkt auf das Quellverzeichnis des Projekts, so dass der Kompilierungsschritt nicht benötigt wird.

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

Ich habe auch die folgenden Einstellungen in shared/classes/alfresco/web-extension/share-config-custom.xml automatische Aktualisierung von Vorlagen und webscripts zu ermöglichen.

<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

Soweit ich verstehe, ist das eher auf die serverseitige Entwicklung von Webseiten zu verstehen (korrigiere mich, wenn ich falsch liege).Meine Frage konzentrierte sich eher auf clientseitige Ressourcen wie JavaScript-Widgets. Egal, was Sie zur Verfügung gestellt haben, ist sehr nützlich und ich werde es in meine Entwicklungsumgebung integrieren. Vielen Dank. –

+0

@ AlejandroGarcíaSeco: Zumindest für Dashlets ist das clientseitige Teil auch im Jar enthalten und steht dann auf dem Klassenpfad zur Verfügung. Wenn Sie den freigegebenen Klassenlader auf Ihr Quellverzeichnis einstellen, entfällt das Kopieren und Packen. Ich bin mir nicht sicher, ob der zweite Teil meiner Antwort in Ihrem Fall benötigt wird, es könnte auch sein, dass einige Zwischenspeicherung von Klassenpfad-Ressourcen deaktiviert ist. –

+0

Ich habe Ihren Vorschlag ausprobiert, funktioniert aber leider nicht richtig für mich. Ich habe Ausnahmen, wenn der Spring-Kontext wie von einigen benutzerdefinierten Evaluatoren initialisiert wird, ich habe versucht, es zu lösen, aber ich war nicht in der Lage, eine direkte Lösung zu finden. Ich werde es nochmal versuchen, da ich jetzt nicht mehr Zeit damit verbringen kann. Tausend Dank. –

1

Ich arbeite normalerweise an privaten Instanzen, so dass ich mir erlauben kann, explodierte Anwendungen auszuführen, sodass alle Änderungen sofort für mich sichtbar sind. Ich muss Tomcat nur neu starten, wenn ich das Datamodel ändere, einige neue java-backed Modules oder webscripts oder ähnliches einsetzen. Auch wenn einige davon auch live geladen werden können.

Verwandte Themen