24 Nisan 2011 Pazar

Maven3 (Proje yönetim aracı)-4: Örnek Proje

Bu yazıda sıfırdan Maven kullanarak bir proje geliştireceğiz. Proje kodlarını buradan indirebilirsiniz.
Projemiz Yahoo Weather RSS servisine bağlanıp girilen koda karşılık gelen bölgenin hava durumu bilgilerini getiren bir konsol uygulaması olacak.
Önce bir önceki yazıda anlattığım maven-quickstart-archive'ı kullanarak bir proje oluşturalım:

mvn archetype:generate -DgroupId=org.sonatype.mavenbook.custom -DartifactId=simple-weather -Dpackage=org.sonatype.mavenbook -Dversion=1.0

Komut satırında sorulduğunda proje iskeleti olarak maven-quickstart-archive'ı seçin. Maven komutu işlemeyi bitirdiğinde simple-weather dizinini oluşturacak ve içine projenin pom.xml dosyasını koyacaktır. Bu dosya:

<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.custom</groupId>
  <artifactId>simple-weather</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>simple-weather</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>
</project>

Projenin hedef Java sürümünü Derleme eklentisi aracılığyla Java 5'e ayarlayın:
<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">
  .................
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  .............
</project>

Kod yazmaya başlamadan önce pom'a proje hakkında biraz bilgi girelim:
<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">
...

  <name>simple-weather</name>
  <url>http://www.sonatype.com</url>

  <licenses>
    <license>
      <name>Apache 2</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
      <comments>A business-friendly OSS license</comments>
    </license>
  </licenses>

  <organization>
    <name>Sonatype</name>
    <url>http://kahveninhatiri.blogspot.com/</url>
  </organization>

  <developers>
    <developer>
      <id>kh</id>
      <name>Kahvenin Hatiri</name>
      <email>kahveninhatiri@gmail.com</email>
      <url>http://kahveninhatiri.blogspot.com/</url>
      <organization>Kahvenin Hatiri</organization>
      <organizationUrl>http://kahveninhatiri.blogspot.com/</organizationUrl>
      <roles>
        <role>developer</role>
      </roles>
      <timezone>+1</timezone>
    </developer>
  </developers>
...
</project>

Sıra geldi projeye birkaç bağımlılık eklemeye. Projemizin XML verileri çözümleme işleri için Dom4J ve Jaxen kütüphanelerini, komut satırına vereceğimiz çıktıyı formatlamak için Velocity kütüphanesini ve günlük kaydı için de Log4J kütüphanesini kullanacağız. Bu bağımlılıkları şu şekilde ekliyoruz:

<project>
  [...]
  <dependencies>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.14</version>
    </dependency>
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>
    <dependency>
      <groupId>jaxen</groupId>
      <artifactId>jaxen</artifactId>
      <version>1.1.1</version>
    </dependency>
    <dependency>
      <groupId>velocity</groupId>
      <artifactId>velocity</artifactId>
      <version>1.5</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  [...]
</project>

Peki ben bu bağımlılıkların koordinatlarını nasıl buldum? Bu iş için jarvana.com adresini kullanabilirsiniz.
Şimdi projemizin kaynak kodlarını ekleyelim. Öncelikle proje iskeleti ile gelen App ve AppTest sınıflarını silelim. Projemiz 5 tane sınıftan oluşacak:

  • org.sonatype.mavenbook.weather.Main: Çalıştırılabilir main() metodunu barındıran sınıf.
  • org.sonatype.mavenbook.weather.Weather: Hava durumu nesnesi. Yer, sıcaklık, nem v.b. bilgileri tutan basit bir JavaBean.
  • org.sonatype.mavenbook.weather.YahooRetriever: Yahoo servisine bağlanıp, RSS kaynağından bir InputStream döner.
  • org.sonatype.mavenbook.weather.YahooParser: Yahoo'dan dönen XML i çözümleyip, bilgileri bir Weather nesnesi olarak döner.
  • org.sonatype.mavenbook.weather.WeatherFormatter: Weather nesnelerini alıp, tanımladığımız Velocity temasına göre formatlar.

package org.sonatype.mavenbook.weather;

public class Weather {
 private String city;
 private String region;
 private String country;
    private String condition;
    private String temp;
    private String chill;
    private String humidity;
    
    public Weather() {}

 public String getCity() { return city; }
 public void setCity(String city) { this.city = city; }

 public String getRegion() { return region; }
 public void setRegion(String region) { this.region = region; }

 public String getCountry() { return country; }
 public void setCountry(String country) { this.country = country; }

 public String getCondition() { return condition; }
 public void setCondition(String condition) { this.condition = condition; }

 public String getTemp() { return temp; }
 public void setTemp(String temp) { this.temp = temp; }
        
 public String getChill() { return chill; }
 public void setChill(String chill) { this.chill = chill; }

 public String getHumidity() { return humidity; }
 public void setHumidity(String humidity) { this.humidity = humidity; }
}

package org.sonatype.mavenbook.weather;

import java.io.InputStream;
import org.apache.log4j.PropertyConfigurator;

public class Main {

 public static void main(String[] args) throws Exception {
  // Configure Log4J
  PropertyConfigurator.configure(Main.class.getClassLoader().getResource("log4j.properties"));

  // Read the Zip Code from the Command-line (if none supplied, use 60202)
  String zipcode = "02101";
        try {
    zipcode = args[0];
        } catch( Exception e ) {}

  // Start the program
  new Main(zipcode).start();
 }

 private String zip;

 public Main(String zip) {
  this.zip = zip;
 }
 
 public void start() throws Exception {
  // Retrieve Data
  InputStream dataIn = new YahooRetriever().retrieve( zip );

  // Parse Data
  Weather weather = new YahooParser().parse( dataIn );

  // Format (Print) Data
  System.out.print( new WeatherFormatter().format( weather ) );
 }
}

package org.sonatype.mavenbook.weather;

import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.log4j.Logger;

public class YahooRetriever {

 private static Logger log = Logger.getLogger(YahooRetriever.class);

 public InputStream retrieve(String zipcode) throws Exception {
  log.info( "Retrieving Weather Data" );
  String url = "http://weather.yahooapis.com/forecastrss?p=" + zipcode;
  URLConnection conn = new URL(url).openConnection();
  return conn.getInputStream();
 }
}

package org.sonatype.mavenbook.weather;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.io.SAXReader;

public class YahooParser {

 private static Logger log = Logger.getLogger(YahooParser.class);

 public Weather parse(InputStream inputStream) throws Exception {
  Weather weather = new Weather();
  
  log.info( "Creating XML Reader" );
  SAXReader xmlReader = createXmlReader();
  Document doc = xmlReader.read( inputStream );

  log.info( "Parsing XML Response" );
  weather.setCity( doc.valueOf("/rss/channel/y:location/@city") );
  weather.setRegion( doc.valueOf("/rss/channel/y:location/@region") );
  weather.setCountry( doc.valueOf("/rss/channel/y:location/@country") );
  weather.setCondition( doc.valueOf("/rss/channel/item/y:condition/@text") );
  weather.setTemp( doc.valueOf("/rss/channel/item/y:condition/@temp") );
  weather.setChill( doc.valueOf("/rss/channel/y:wind/@chill") );
  weather.setHumidity( doc.valueOf("/rss/channel/y:atmosphere/@humidity") );
  
  return weather;
 }

 private SAXReader createXmlReader() {
  Map uris = new HashMap();
        uris.put( "y", "http://xml.weather.yahoo.com/ns/rss/1.0" );
        
        DocumentFactory factory = new DocumentFactory();
        factory.setXPathNamespaceURIs( uris );
        
  SAXReader xmlReader = new SAXReader();
  xmlReader.setDocumentFactory( factory );
  return xmlReader;
 }
}

package org.sonatype.mavenbook.weather;

import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;

import org.apache.log4j.Logger;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

public class WeatherFormatter {

 private static Logger log = Logger.getLogger(WeatherFormatter.class);

 public String format( Weather weather ) throws Exception {
  log.info( "Formatting Weather Data" );
  Reader reader = new InputStreamReader( getClass().getClassLoader().getResourceAsStream("output.vm"));
  VelocityContext context = new VelocityContext();
  context.put("weather", weather );
  StringWriter writer = new StringWriter();
  Velocity.evaluate(context, writer, "", reader);
  return writer.toString();  
 }
}


Bu sınıfları simple-weather\src\main\java\org\sonatype\mavenbook dizini altında oluşturun.
Şimdi Log4J ve Velocity için ayar dosyalarını ekleyelim. Önce eğer yoksa src/main/ altında resources/ klasörü oluşturun. Bu klasörün içinde log4j.properties dosyası oluşturup içine şunları yazın:

# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r %-5p %c{1} %x - %m%n

Bu ayarlar Log4J'nin günlük çıktılarını ekrana hangi formatta basacağı ile ilgilidir.

Sıra velocity'nin ayar dosyasında. Yine aynı klasörde output.vm dosyasını oluşturun ve içine şunları yazın.

*********************************
Current Weather Conditions for:
${weather.city}, ${weather.region}, ${weather.country}

Temperature: ${weather.temp}
Condition: ${weather.condition}
Humidity: ${weather.humidity}
Wind Chill: ${weather.chill}
*********************************

Sizin de tahmin edebileceğiz gibi bu ayar dosyası bir Weather nesnesinin alanlarına erişip (${weather.temp}) verilecek çıktı için bir düzen tanımlar.

Projemizin çalışması için gerekli herşey bu kadar. Şimdi mvn install komutuyla projeyi yerel depoda yayınlayalım.
3. parti bir eklenti olan Exec eklentisi ile projeyi çalıştıralım:
mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main
Bu komut ön tanımlı olan 60202 bölge kodlu Evanston'ın hava durumu bilgilerini ekrana getirecektir. Eğer komut satırından başka bir bölge kodu girmek isterseniz, şöyle yapabilirsiniz.

mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main -Dexec.args="70112"

Maven en başta bizim eklediğimiz 4 bağımlılığın dışında,geçişli bağımlılıkları da classpath'e ekler. Hangi kütüphanelerin classpath'ta olduğunu öğrenmek için, bağımlılıkları çözümleyebilrisiniz. Bunun için gerekli komut:

mvn dependency:resolve
...
[INFO] [dependency:resolve]
[INFO] 
[INFO] The following files have been resolved: 
[INFO]    com.ibm.icu:icu4j:jar:2.6.1 (scope = compile)
[INFO]    commons-collections:commons-collections:jar:3.1 (scope = compile)
[INFO]    commons-lang:commons-lang:jar:2.1 (scope = compile)
[INFO]    dom4j:dom4j:jar:1.6.1 (scope = compile)
[INFO]    jaxen:jaxen:jar:1.1.1 (scope = compile)
[INFO]    jdom:jdom:jar:1.0 (scope = compile)
[INFO]    junit:junit:jar:3.8.1 (scope = test)
[INFO]    log4j:log4j:jar:1.2.14 (scope = compile)
[INFO]    oro:oro:jar:2.0.8 (scope = compile)
[INFO]    velocity:velocity:jar:1.5 (scope = compile)
[INFO]    xalan:xalan:jar:2.6.0 (scope = compile)
[INFO]    xerces:xercesImpl:jar:2.6.2 (scope = compile)
[INFO]    xerces:xmlParserAPIs:jar:2.6.2 (scope = compile)
[INFO]    xml-apis:xml-apis:jar:1.0.b2 (scope = compile)
[INFO]    xom:xom:jar:1.0 (scope = compile)

mvn dependency:tree komutu bağımlılıkları ağaç yapısında gösterir.

mvn dependency:tree
...
[INFO] [dependency:tree]
[INFO] org.sonatype.mavenbook.custom:simple-weather:jar:1.0
[INFO] +- log4j:log4j:jar:1.2.14:compile
[INFO] +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] +- jaxen:jaxen:jar:1.1.1:compile
[INFO] |  +- jdom:jdom:jar:1.0:compile
[INFO] |  +- xerces:xercesImpl:jar:2.6.2:compile
[INFO] |  \- xom:xom:jar:1.0:compile
[INFO] |     +- xerces:xmlParserAPIs:jar:2.6.2:compile
[INFO] |     +- xalan:xalan:jar:2.6.0:compile
[INFO] |     \- com.ibm.icu:icu4j:jar:2.6.1:compile
[INFO] +- velocity:velocity:jar:1.5:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.1:compile
[INFO] |  +- commons-lang:commons-lang:jar:2.1:compile
[INFO] |  \- oro:oro:jar:2.0.8:compile
[INFO] +- org.apache.commons:commons-io:jar:1.3.2:test
[INFO] \- junit:junit:jar:3.8.1:test
...

Eğer proje için düşünülmüş ama sürüm uyuşmazlığı veya diğer nedenlerle seçilmeyen bağımlılıkları da görmek isterseniz, komutu hata ayıklama kipinde çalıştırın:

mvn install -X
...
[DEBUG] org.sonatype.mavenbook.custom:simple-weather:jar:1.0 (selected for null)
[DEBUG]   log4j:log4j:jar:1.2.14:compile (selected for compile)
[DEBUG]   dom4j:dom4j:jar:1.6.1:compile (selected for compile)
[DEBUG]     xml-apis:xml-apis:jar:1.0.b2:compile (selected for compile)
[DEBUG]   jaxen:jaxen:jar:1.1.1:compile (selected for compile)
[DEBUG]     jaxen:jaxen:jar:1.1-beta-6:compile (removed - )
[DEBUG]     jaxen:jaxen:jar:1.0-FCS:compile (removed - )
[DEBUG]     jdom:jdom:jar:1.0:compile (selected for compile)
[DEBUG]     xml-apis:xml-apis:jar:1.3.02:compile (removed - nearer: 1.0.b2)
[DEBUG]     xerces:xercesImpl:jar:2.6.2:compile (selected for compile)
[DEBUG]     xom:xom:jar:1.0:compile (selected for compile)
[DEBUG]       xerces:xmlParserAPIs:jar:2.6.2:compile (selected for compile)
[DEBUG]       xalan:xalan:jar:2.6.0:compile (selected for compile)
[DEBUG]       xml-apis:xml-apis:1.0.b2.
[DEBUG]       com.ibm.icu:icu4j:jar:2.6.1:compile (selected for compile)
[DEBUG]   velocity:velocity:jar:1.5:compile (selected for compile)
[DEBUG]     commons-collections:commons-collections:jar:3.1:compile 
[DEBUG]     commons-lang:commons-lang:jar:2.1:compile (selected for compile)
[DEBUG]     oro:oro:jar:2.0.8:compile (selected for compile)
[DEBUG]   junit:junit:jar:3.8.1:test (selected for test)

Aslında proje oluşturma aşaması burada bitti. Ancak Maven'ın yeteneklerini göstermek için devam edelim ve projemize Birim Testleri ekleyelim.
Öncelikle eğer yoksa src\test\java\org\sonatype\mavenbook sizini oluşturun. Biz burada iki sınıfı test edeceğiz, birincisi YahooParser. Bunun için YahooParserTest sınıfını oluşturun ve içine şunları yazın.

package org.sonatype.mavenbook.weather;

import java.io.InputStream;

import junit.framework.TestCase;

import org.sonatype.mavenbook.weather.Weather;
import org.sonatype.mavenbook.weather.YahooParser;

public class YahooParserTest extends TestCase {

 public YahooParserTest(String name) {
  super(name);
 }
 
 public void testParser() throws Exception {
  InputStream nyData = 
   getClass().getClassLoader().getResourceAsStream("ny-weather.xml");
  Weather weather = new YahooParser().parse( nyData );
  assertEquals( "New York", weather.getCity() );
  assertEquals( "NY", weather.getRegion() );
  assertEquals( "US", weather.getCountry() );
  assertEquals( "39", weather.getTemp() );
  assertEquals( "Fair", weather.getCondition() );
  assertEquals( "39", weather.getChill() );
  assertEquals( "67", weather.getHumidity() );
 }
}

Bu sınıftaki JUnit detaylarına girmeyeceğim, bu kısmı JUnit'i anlattığım bir yazıda açıklarım belki. Burada YahooParser sınıfının gelen XML bilgisini doğru çözümleyip çözümlemediği kontrol ediyoruz. Bunun önce sınayacağımız bir veriye ihtiyacımız var. Bu veriyi classpath'taki ny-weather.xml dosyasından alıyoruz. (birazdan bu dosyayı classpath'e koyacağız.) ve bu dosyadaki değerlerle karşılaştırıyoruz. Hepsi doğruysa test hata vermeden tamamlanacaktır.

İkinci testimiz WeatherFormatter sınıfı için. Bunun için WeatherFormatterTest sınıfını aynı dizinde oluşturun.

package org.sonatype.mavenbook.weather;

import java.io.InputStream;

import org.apache.commons.io.IOUtils;

import org.sonatype.mavenbook.weather.Weather;
import org.sonatype.mavenbook.weather.WeatherFormatter;
import org.sonatype.mavenbook.weather.YahooParser;

import junit.framework.TestCase;

public class WeatherFormatterTest extends TestCase {

 public WeatherFormatterTest(String name) {
  super(name);
 }
 
 public void testFormat() throws Exception {
  InputStream nyData = 
   getClass().getClassLoader().getResourceAsStream("ny-weather.xml");
  Weather weather = new YahooParser().parse( nyData );
  String formattedResult = new WeatherFormatter().format( weather );
  InputStream expected = 
   getClass().getClassLoader().getResourceAsStream("format-expected.dat");
  assertEquals( IOUtils.toString( expected ), formattedResult );
 }
}

Bu sınıfta WeatherFormatter ın Weather nesnelerini doğru biçemlendirip biçimlendirmediği sınıyoruz. Bunun için karşılaştıracağımız bir kaynağa ihtiyacımız var. Bu kaynağı format-expected.dat dosyasından alıyoruz (bu dosyayı da birazdan oluşturacağız.).
Burada açıklamam gereken bir ayrıntı daha var. G/Ç işleriyle uğraşmamak için bir InputStream i String olarak dönen Apache Commons un commons-io kütüphanesini kullanıyoruz. Aslında bunu elle de yapabilirdik ancak test kapsamlı bağımlıkları göstermek için bu kütüphaneyi kullanıyoruz. Şimdi bu bağımlılığı pom'a ekleyelim.


  ...
  
    ...
    
      org.apache.commons
      commons-io
      1.3.2
      test
    
    ...
  


Şimdi daha önce söz verdiğimiz dosyaları ekleyelim. Önce eğer yoksa src/test/resources dizinini oluşturun.
format-expected.dat dosyasını oluşturup içine şunları yazın.

*********************************
Current Weather Conditions for:
New York, NY, US

Temperature: 39
Condition: Fair
Humidity: 67
Wind Chill: 39
*********************************

ny-weather.xml dosyasını oluşturup içine şunları yazın.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
 <channel>
 <title>Yahoo! Weather - New York, NY</title>
 <link>http://us.rd.yahoo.com/dailynews/rss/weather/New_York__NY/*http://weather.yahoo.com/forecast/10002_f.html</link>
 <description>Yahoo! Weather for New York, NY</description>
 <language>en-us</language>
 <lastBuildDate>Sat, 10 Nov 2007 8:51 pm EDT</lastBuildDate>

 <ttl>60</ttl>
 <yweather:location city="New York" region="NY" country="US" />
 <yweather:units temperature="F" distance="mi" pressure="in" speed="mph" />
 <yweather:wind chill="39" direction="0" speed="0" />
 <yweather:atmosphere humidity="67" visibility="1609" pressure="30.18" rising="1" />
  <yweather:astronomy sunrise="6:36 am" sunset="4:43 pm" />
  <image>
 <title>Yahoo! Weather</title>

 <width>142</width>
 <height>18</height>
 <link>http://weather.yahoo.com/</link>
 <url>http://l.yimg.com/us.yimg.com/i/us/nws/th/main_142b.gif</url>
 </image>
 <item>
 <title>Conditions for New York, NY at 8:51 pm EDT</title>

  <geo:lat>40.67</geo:lat>
 <geo:long>-73.94</geo:long>
  <link>http://us.rd.yahoo.com/dailynews/rss/weather/New_York__NY/*http://weather.yahoo.com/forecast/10002_f.html</link>
 <pubDate>Sat, 10 Nov 2007 8:51 pm EDT</pubDate>
 <yweather:condition text="Fair" code="33" temp="39" date="Sat, 10 Nov 2007 8:51 pm EDT" />
 <description><![CDATA[
<img src="http://l.yimg.com/us.yimg.com/i/us/we/52/33.gif" /><br />
 <b>Current Conditions:</b><br />
 Fair, 39 F<BR /><BR />
 <b>Forecast:</b><BR />
  Sat - Partly Cloudy. High: 45 Low: 32<br />
  Sun - Sunny. High: 50 Low: 38<br />
 <br />
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/New_York__NY/*http://weather.yahoo.com/forecast/10002_f.html">Full Forecast at Yahoo! Weather</a><BR/>
 (provided by The Weather Channel)<br/>
 ]]></description>
 <yweather:forecast day="Sat" date="10 Nov 2007" low="32" high="45" text="Partly Cloudy" code="29" />

<yweather:forecast day="Sun" date="11 Nov 2007" low="38" high="50" text="Sunny" code="32" />
  <guid isPermaLink="false">10002_2007_11_10_20_51_EDT</guid>
 </item>
</channel>
</rss><!-- p7.weather.re3.yahoo.com compressed/chunked Sat Nov 10 17:57:31 PST 2007 -->

Şimdi testlerimizi çalıştırabiliriz. Aslında mvn package veya mvn install komutlarını çalıştırınca bu evrelerden önce olan test evresi de çalıştırılır. Ancak sadece test evresini çalıştırmak isterseniz mvn test komutunu da kullanabilirsiniz. Bu komutu çalıştırınca Maven Surfire eklentisi testlerinizi çalıştıracaktır ve testler hakkında detaylı bilgileri ${basedir}/target/surefire-reports altına koyacaktır. Eğer bir şeyler ters giderse buraya bakın :)

Eğer hatalı testlerin inşa işlemini bölmesini istemiyorsanız Bunu iki şekilde belirtebilirsiniz. İlki pom'a şu parçayı ekleyerek:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <testFailureIgnore>true</testFailureIgnore>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

İkincisi komut satırından:
mvn test -Dmaven.test.failure.ignore=true

Eğer bir inşada testleri atlamak isterseniz bunu da yine iki şekilde yapabilirsiniz. İlki pom'a şu parçayı ekleyerek:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

İkincisi yine komut satırından:
mvn install -Dmaven.test.skip=true
...
[INFO] [compiler:testCompile]
[INFO] Not compiling test sources
[INFO] [surefire:test]
[INFO] Tests are skipped.
...

Kolay Gelsin.

Hiç yorum yok:

Yorum Gönder