25 Nisan 2011 Pazartesi

Maven3 (Proje yönetim aracı)-5: Örnek Web Projesi

Merhabalar. Bu yazıda basit bir web uygulamasını Maven kullanarak nasıl yapılacağını anlatacağım. Oluşturacağımız proje bir önceki yazıda anlattığım projeye büyük oranda benzeyecek. Bu yüzden hafizanızı tazelemenize ihtiyacınız olabilir. Hadi başlayalım.

Önce yine şu komut ile proje oluşturulmasını tetikleyin:
mvn archetype:generate -DgroupId=org.sonatype.mavenbook.simpleweb -DartifactId=simple-webapp -Dpackage=org.sonatype.mavenbook
Sorulduğunda proje iskeleti olarak maven-archetype-webapp'ı seçin. İşlem tamamlandığında şuna benzer bir POM oluşacak.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sonatype.mavenbook.simpleweb</groupId>
  <artifactId>simple-webapp</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>simple-webapp Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>simple-webapp</finalName>
  </build>
</project>

Bu POM'da bir önceki projeninkinden farklı olarak dikkatinizi çekebilecek 2 şey var. Birincisi projenin paketleme biçimi WAR olarak belirlenmiş. İkincisi ise build öğesi altına finalName öğesini eklenmiş. Bu öğe paketleme evresinde WAR'a son adını vermekte kullanılır. Bu örneğe göre, projemiz target/ dizini altına simple-webapp.war olarak yayınlanacak.

Projeyi Çalıştırmak
Bir önceki projenin aksine bu proje bir web uygulaması olduğu için çalıştırmak için Exec eklentisini kullanamayız. Normal şartlar altında(NŞA) bu iş için Tomcat ya da Jetty gibi bir Servlet Kabı(Container)'nı internetten indirip, ayarlarını yapıp, simple-webapp.war dosyasını webapps/ altına koyup sonra da kabı başlatmanız gerekir. Ancak bunun daha kolay bir yolu var. Maven Jetty eklentisini bu iş için kullanabilirsiniz. Şu POM parçasını projenize eklemeniz yeterli:

<project>
  [...]
  <build>
    <finalName>simple-webapp</finalName>
    <plugins>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Sonrasında Jetty eklentisinin Run hedefini kullanarak uygulamayı çalıştırabilirsiniz.

~/examples/ch-simple-web/simple-webapp $ mvn jetty:run
...
[INFO] [jetty:run]
[INFO] Configuring Jetty for project: simple-webapp Maven Webapp
[INFO] Webapp source directory = \
       ~/svnw/sonatype/examples/ch-simple-web/simple-webapp/src/main/webapp
[INFO] web.xml file = \
 ~/svnw/sonatype/examples/ch-simple-web/\
simple-webapp/src/main/webapp/WEB-INF/web.xml
[INFO] Classes = ~/svnw/sonatype/examples/ch-simple-web/\
simple-webapp/target/classes
2007-11-17 22:11:50.532::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
[INFO] Context path = /simple-webapp
[INFO] Tmp directory =  determined at runtime
[INFO] Web defaults = org/mortbay/jetty/webapp/webdefault.xml
[INFO] Web overrides =  none
[INFO] Webapp directory = \
       ~/svnw/sonatype/examples/ch-simple-web/simple-webapp/src/main/webapp
[INFO] Starting jetty 6.1.6rc1 ...
48
2007-11-17 22:11:50.673::INFO:  jetty-6.1.6rc1
2007-11-17 22:11:50.846::INFO:  No Transaction manager found 
2007-11-17 22:11:51.057::INFO:  Started SelectChannelConnector@0.0.0.0:8080
[INFO] Started Jetty Server

DİKKAT: Maven Jetty eklentisini Windows altında çalıştırıyorsanız, yerel deponuzu adında boşluk içermeyen bir dizine almanız gerekebilir. Çünkü böyle durumlarda (örneğin yerel deponun "C:\Documents and Settings\" altında olması durumunda) bazen Jetty'nin başlatılamaması hatası ile karşılabilirsiniz. Çözüm deponuzu adında boşluk içermeyen bir yere alıp, bu yeri de ~/.m2/settings.xml dosyasında tekrar belirtmektir.
Jetty başlatıldıktan sonra, tarayıcınızdan http://localhost:8080/simple-webapp/ adresine gidin. Eğer herşey yolundaysa bir "Merhaba Dünya" görmelisiniz. Karşınıza gelen sayfa maven-archetype-webapp iskeletinin oluşturduğu index.jsp sayfasıdır. Maven ön tanımlı olarak herhangi bir web uygulamasının ana dizinini src/main/webapp/ olarak kabul eder. İşte az önce gördüğümüz index.jsp de bu dizindedir. İçeriğini merak ettiyseniz:


<html>
  <body>
    <h2>Hello World!</h2>
  </body>
</html>

src/main/webapp/WEB-INF altında ise yine çok basit bir web.xml dosyası vardır:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>

Servlet Eklemek
Şimdi projemize biraz Java kodu ekleyelim. Öncelikle eğer halihazırda yoksa src/main/java/org/sonatype/mavenbook/web dizinini sonra da içinde SimpleServlet.java sınıfını oluşturun. İçine de şunları yazın:

package org.sonatype.mavenbook.web;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SimpleServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException {
 PrintWriter out = response.getWriter();
 out.println( "SimpleServlet Executed" );
        out.flush();
        out.close();
    }
}

Servlet'imiz aslında bir çeşit "Merhaba Dünya" servlet'inden başka birşey değil. Bu servlet'i uygulamamız altında çağrılan bir yola bağlamak için web.xml'i kullanacağız. Aşağıdaki web.xml ile servlet'imizi simple/ yoluna bağlıyoruz. Yani ne zaman http://localhost:8080/simple-webapp/simple adresine bir istek yapılsa bu servlet çağırılacak.

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>simple</servlet-name>
    <servlet-class>org.sonatype.mavenbook.web.SimpleServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>simple</servlet-name>
    <url-pattern>/simple</url-pattern>
  </servlet-mapping>
</web-app>

Şimdi de projemize Servlet API'nin bağımlılığını ekleyelim:

<project>
  [...]
  <dependencies>
    [...]
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.4</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  [...]
</project>

Burada bağımlılığın kapsamının provided olduğuna dikkat edin. Bu Maven'a bağımlılığı WAR dosyasının içine koymamasını çünkü servlet kabı tarafından sağlanacağını söyler. Eğer projede JSP etiketleri kullanırsanız JSP belirtim kütüphanesini de classpath'a eklemeniz gerekir.

<project>
  [...]
  <dependencies>
    [...]
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  [...]
</project>

Şimdi uygulamamamızı çalıştırabiliriz. Uygulama kodları değiştiği için, Jetty'i tekrar çalıştırmamız gerekecek. Eğer Jetty hala çalışıyorsa CTRL+C tuşlarıyla durdurun. mvn clean install komutu ile tekrar inşa edin ve mvn jetty:run ile Jetty'i tekrar çalıştırın.

Tarayıcınızdan http://localhost:8080/simple-webapp/simple adresine gittiğinizde "Simple Executed" çıktısını görmeniz lazım.

Bu yazıda basit bir Java Web uygulaması geliştirdik, uygulmamıza bir servlet ekledik ve servlet kabı içinden çalıştırdık. Şimdi bu temel uzerine kendiniz geliştirmeler yapabilirsiniz. Örneğin POM'a PrimeFaces kütüphanesini ekleyip biraz JSF alıştırması yapın.
Kolay Gelsin.

Hiç yorum yok:

Yorum Gönder