[Lösung]J2EE - Sun Applicationserver und Eclipse

Christian Fein

Erfahrenes Mitglied
Servlets mit Eclipse auf Tomcat zu entwickeln geht dank Sysedo Tomcat Plugin ja
wunder komfortable.

Der Sun Java Application - der u.a auch Tomcat nutzt lässt sich damit aber nicht ansteuern.

Ich habe dennoch jetzt einen Weg gefunden wie ich die Funktionalität des Tomcat Plugins nachgebaut habe. Mit ant.

Kurze beschreibung:

Mann benötigt ein leeren Projektordner in dem mann die Dateien eines leeren Tomcat Projectes hineinkopiert, und am besten schon eine leere (bzw Datenauskommentierte) web.xml mit dazupackt. Der Ordner (ich nenne ihn websrc) sollte follgendermassen aussehen.
Code:
websrc
	.cvsignore
	.project
        .classpath
        build.xml
	WEB-INF
		web.xml

Bei mir liegt der Ordner unter /home/java/ant/ und auf diesen Ordner ist auch mein ant-buildfile ausgerichtet.
Ausser dem Ordner websrc sollte auch noch unter /home/java/ant/ ein Ordner dist
angelegt werden.

Mein Buildfile macht follgendes:
- es erstellt einen Ordner im ordner dist mit namen des Projekts (wird als Argument mit angegeben)
- es erstellt anhand des Ordners ein .war file das den Namen des Projektes trägt.
- es kopiert das war File in den autodeploy Ordner der betreffenden Domain
bei mir /home/holyfly/appserver/domains/domain1/autodeploy
- hier wird die war automatisch vom ApplicationServer deployed und mann findet die Dateien unter /home/holyfly/appserver/domains/domain1/applications/j2ee-modules/[PROJECTNAME]
- mann sollte ca 2-3 Sekunden warten um einen neuen Build aufzurufen (da der deploy-vorgang bis zu 2 Sekunden dauern kann)
- durch das Target src werden im j2ee-modules/[PROJECTNAME] die im .classpath angegeben ordner src und work erstellt

Danach kann mann über Eclipse "import Project" den ordner [APPLICATIONSERVER-DOMAIN]/applications/j2ee-modules/[PROJECTNAME] auswählen und somit als ein Projekt einbinden.

Die build.xml im Projekt kann über Kontext Menu - Run Ant bisher 2 Dinge.
Den ApplicationServer - Restarten um auch änderrungen in der web.xml einzulesen.
Den Servlet Context - Reloaden um geänderte Klassen erneut einzulesen.

Damit hat mann das wichtigste was auch das Tomcat Plugin liefert.
Hier nochmal die gewünschte Ordnerstruktur
Hinter jeden Namen befindet sich eine beklammerte Zahl z.b [1].
Diese Kenntzeichnet die Source des Files, die unten dargestellt wird-

Code:
. 
  websrc 
      .classpath [1]      
      .project [2]
      .cvsignore [3]      
      build.xml [4]
      WEB-INF
      		web.xml [5]
   dist
websrc_build.xml [6]

Source zu [1]
Code:
 <?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="var" path="TOMCAT_HOME/common/lib/servlet.jar"/>
    <classpathentry kind="var" path="TOMCAT_HOME/common/lib/jasper-runtime.jar"/>
    <classpathentry kind="var" path="TOMCAT_HOME"/>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="work"/>
    <classpathentry kind="output" path="WEB-INF/classes"/>
</classpath>

Source zu [2]
Code:
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>LittleServlet</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.jdt.core.javanature</nature>
		<nature>com.sysdeo.eclipse.tomcat.tomcatnature</nature>
	</natures>
</projectDescription>


Source zu [3]
Code:
classes
ja mehr steht da wirklich nicht drinne ;)

Source zu [4]
Code:
<?xml version="1.0"?>
<project name="reloader" default="reload" basedir=".">
  <property name="appserver.start.command"  value="${appserver.dir}/stopserv" />
  <property name="appserver.start.command"  value="${appserver.dir}/startserv" />

  <target name="reload" >
    <exec dir="." executable="touch" os="Linux">
     <arg line=".reload"/>
    </exec>
  </target>

  <target name="restart" >
    <exec dir="." executeable="${appserver.stop.command" />
    <exec dir="." executeable="${appserver.start.command" />
  </target>
</project>
Dieses Buildfile wird in das Projekt mit aufgenommen und ist für das neu laden, restarten zuständig. Ihr müsst natürlich die Properties an euer system anpassen

Source zu [5]
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<!-- <servlet>
        <servlet-name></servlet-name>
        <servlet-class></servlet-class>
    </servlet> -->
<!--    <init-param>
            <param-name></param-name>
            <param-value></param-value>
        </init-param> -->
<!--    <servlet-mapping>
        <servlet-name></servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>  -->
<!--<welcome-file-list>
        <welcome-file></welcome-file>
    </welcome-file-list> -->

        <!-- tag libs -->
<!--    <taglib>
        <taglib-uri></taglib-uri>
        <taglib-location></taglib-location>
    </taglib> -->
</web-app>

Ich habe alles ausser <web-app> auskommentiert. Einkommentieren und ausfüllen ist
leichter als sich alles zu merken ;)


So nun die etwas dickere builddatei die das ganze startet..

Source zu [6]
Code:
<?xml version="1.0"?>
<project name="websrc-build" default="initmsg" basedir=".">
  <property name="project.type" value="websrc-build" />
  <property name="project.name" value="builded-websrc4" />
  <property name="src.dir" value="websrc"/>
  <property name="target.dir" value="./dist/${project.name}"/>
  <property name="appserver.dir" value="/home/holyfly/appserver/domains/domain1" />
  <property name="appserver.deploy.dir" value="${appserver.dir}/autodeploy" />
  <property name="appserver.project.folder" value="${appserver.dir}/applications/j2ee-modules/${project.name}"/>
  <property name="appserver.project.src.folder"  value="${appserver.project.folder}/src" />
  <property name="appserver.project.work.folder" value="${appserver.project.folder}/work" />
<!-- TARGETS -->
  <target name="initmsg" description="console output">
    <echo message="Build type: ${project.type} name: ${project.name}"/>
    <echo message="            create folder : ${target.dir}"/>
  </target>
 
  <target name="initsrc" description="console output">
    <echo message="Create folder for src" />
    <echo message="       create folder: ${appserver.project.src.folder}"/>
    <echo message="       create folder: ${appserver.project.work.folder}"/>
  </target>

  <target name="delete" depends="initmsg" >
    <delete dir="${target.dir}" />
  </target>

  <target name="create" depends="delete" >
    <mkdir dir="${target.dir}" />
    <mkdir dir="${target.dir}/WEB-INF"/>
  </target>

  <target name="copy" depends="create" >
    <copy todir="${target.dir}" >
      <fileset dir="${src.dir}" />
    </copy>
  </target>

  <target name="warfile_create" depends="copy">
    <war destfile="./dist/${project.name}.war"
         basedir="${target.dir}"
	 webxml="${target.dir}/WEB-INF/web.xml" />
  </target>
  
  <target name="warfile" depends="warfile_create" >
   <echo message=".war File wurde erstellt!" />
  </target>

  <target name="deploy" depends="warfile" >
   <echo message="Deploy das .war in: ${appserver.deploy.dir}"/>
   <copy todir="${appserver.deploy.dir}">
     <fileset dir="." >
       <include name="${project.name}.war"/>
     </fileset>
   </copy>
  </target>

  <target name="src" depends="initsrc">
   <mkdir dir="${appserver.project.src.folder}" />
   <mkdir dir="${appserver.project.work.folder}" />
  </target>
  
</project>

Aufgrufen wird diese dann über Ant folgendermassen:

$ ant -Dproject.name=MeinNeuesProjekt -f build_websrc.xml deploy
..... Viele viele Meldungen was jetzt passiert
$ ant -Dproject.name=MeinNeuesProjekt -f build_websrc.xml src
.... nur die Meldung das die Ordner src und Work angelegt wurden.

Danach das Projekt nur noch über Import Projekt in Eclipse importieren
und per Run Ant auf das build.xml File Server neu starten bzw reloaden.

Bitte bedenk das alle Property Tags an das betreffende System angepasst
werden müssen. Sprich alle Pfadangaben sollten stimmen, sonst gibts ein
build failed.

Bei mir verrichtet das Ant-Script gute Dinge :)
 
Zurück