Appfuse Hızlı Geliştirme Alt Yapısı Kurulumu Adım Adım
Appfuse Eclipse Hızlı Geliştirme Alt Yapısı Adım Adım
Hazırlayan: Bilgin Yazar 2008
1. Özet Olarak; 1
2. Appfuse Nedir?. 1
3. Geliştirme Ortamının Hazırlanması - Development Environment 3
4. Hızlı Başlangıç- Quick Start 3
5. Eclipse de MyProject in Açılması 7
6. Person Objesi İçin CRUD oluşturalım.. 8
7. Tutorial 8
8. Oluşabilecek Hatalar 9
8.1. Oluşan Hataları Görme. 9
8.2. XML.. 9
8.3. Regional Setting – Turkish. 10
8.4. Mail.properties. 10
8.5. Connection refused. 11
9. Appfuse Forum.. 11
10. Candy for AppFuse. 11
11. Örnek. 12
1. Özet Olarak;
Appfuse open source teknolojileri kullanarak oluşturulmuş entegre bir J2EE proje alt yapısıdır. Bu yönüyle proje alt yapısı ihtiyaçları ve vizyon açısından güzel bilgiler vermektedir. Ancak benim gördüğüm bazı eksiklikler var:
1. IDE olarak Eclipse i düşündüğümüzde farklı versiyonlar arasında sorun çıkıyor.
2. Bildiğimiz anlamda Eclipse de Debug edebilmek için bir yol bulamadım.
2. Appfuse Nedir?
Bir projeye başladığımızda proje alt yapısının oluşturulması için oldukça zaman harcarız.
Aynı zamanda projelerimizde çok sıklıkla yaptığımız işler vardır. Örneğin CRUD -Create, Update, Delete- işlemlerini içeren ekranlar ve kodlar hazırlamamız gerekir. (Ya da database deki tablolarımız için ekranlar yapmak, onlar için gerekli sınıfları v.b. oluşturmak)
Ayrıca güvenlik ayarları ve uygulamanın erişim - yetkilendirme alt yapısını oluşturmak da her zaman yapmak zorunda olduğumuz işler arasındadır. Bu tür rutin işler oldukça yorucu olabilmektedir.
Appfuse ı açık kaynak kodlu yazılım araçlarını ve kütüphanelerini yazılım geliştirme alt yapısı oluşturmak amacıyla entegre etmiş bir açık kaynak kodlu yardımcı bir uygulama ya da entegre proje olarak tanımlayabiliriz.
Aşağıdaki IDE leri desteklemektedir:
Eclipse
IDEA
MyEclipse
NetBeans
Appfuse’ın Ana Sayfası http://appfuse.org/
Appfuse konusunda yazılmış güzel bir makale aşağıdaki sayfada bulunmaktadır.
http://www-128.ibm.com/developerworks/java/library/j-appfuse/
Appfuse aşağıdaki özellikleri hazır olarak size sunar.
- Authentication and authorization
- User management
- Remember Me (which saves your login information so you don't have to log in every time)
- Password reminder
- Signup and registration
- SSL switching
- URL rewriting
- Skinability
- Page decoration
- Templated layout
- File upload
Typical AppFuse application
3. Geliştirme Ortamının Hazırlanması - Development Environment
Öncelikle Development Environment’in hazırlanması gerekiyor. Aşağıdaki sayfada gerekli ayarların nasıl yapılacağı anlatılmaktadır.
http://appfuse.org/display/APF/Development+Environment
4. Hızlı Başlangıç- Quick Start
Quick Start a göre Appfuse kurulumu gerçekleştiriliyor. Öncelikle repository ayarını yapıyoruz:
Sonra C:\appfuse\tools\maven-2.0.8\conf
deki settings.xml de
olarak değiştiriyoruz.
Şimdi normal tutorial a devam edebiliriz.
http://appfuse.org/display/APF/AppFuse+QuickStart
JSF Basic için olan command C:\appfuse\Source\ çalıştırılır.
Archetype Command JSF Basic
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-jsf -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.1 -DgroupId=com.mycompany.app –DartifactId=myproject
Yukarıdaki komutu çalıştırdıktan sonra proje için gerekli library’ler repository dizini içine download edilecek. İnternet bağlantısınında problem oluyorsa bu library zip olarak indirip repository dizinine açabiliriz. Buna “Developing Offline” olarak ortamı hazırlamak deniyor.
İlk olarak
http://appfuse.org/display/APF/AppFuse+QuickStart
“Developing Offline” başlığı altındaki download its dependencies
linkinden en son zip i indiriyoruz. (appfuse-dependencies-2.0.1.zip)
Sonra zip dosyasını C:\appfuse\.m2 içine açıyoruz. Aşağıdaki şekilde dizinler oluşuyor.
C:\appfuse\.m2\repository
Sonra Mysql i service olarak kurduysak, çalıştığından emin oluyoruz.
Uygulamayı çalıştırmak için ise;
C:\appfuse\Source\myproject>mvn jetty:run-war
komutunu kullanıyoruz. Hata aldıysanız Oluşabilecek Hatalar ya da Forum a bakınız.
Sonra
http://localhost:8080/
ile uygulamaya bağlanılır. Admin/Admin
Yukarıdaki Person Link ilk kurulumda yer almaz.
5. Eclipse de MyProject in Açılması
Bilgisayarımıza Eclipse 3.2 ya da Eclipse 3.3Rc2 yüklemiş olmamız gerekiyor.
Öncelikle aşağıdaki komutu çalıştırıyoruz.
mvn install eclipse:eclipse
Eclipse açılırken workspace olarak C:\appfuse\Source
belirliyoruz.
Sonra Eclipse ayarlarını aşağıdaki linke göre yapıyoruz.
http://appfuse.org/display/APF/Eclipse
Yani MyProject I import etmemiz gerekiyor.
File > Import > Existing Projects into Workspace
Sonra
Window > Preferences dan Java > Build Path > Classpath Variables
M2_REPO = C:/appfuse/.m2/repository
olarak tanımlıyoruz.
6. Person Objesi İçin CRUD oluşturalım
Person objesine ilişkin
http://appfuse.org/display/APF/Persistence
POJO ve JPA Annotations ları oluşturulduktan sonra aşağıdaki maven komutları ile Person objesine ait web arayüzleri ve ilgili kodlar otomatik olarak oluşturulur. (master/detail screens that CRUD a Person object)
C:\appfuse\Source\myproject>mvn test-compile hibernate3:hbm2ddl
C:\appfuse\Source\myproject>mvn appfuse:gen
C:\appfuse\Source\myproject>mvn appfuse:install
C:\appfuse\Source\myproject>mvn jetty:run-war
http://appfuse.org/display/APF/AppFuse+Maven+Plugin
Uygulamadaki teknolojiler hakkında http://appfuse.org/display/APF/Using+JSF
bakınız.
7. Tutorial
Tutorial üzerinde çalışmak ve kod alt yapısını öğrenmek için aşağıdaki linkteki tutorial lar takip edilir. Öğrenme amacıyla manual olarak anlatılmaktadır. http://appfuse.org/display/APF/Tutorials
8. Oluşabilecek Hatalar
8.1. Oluşan Hataları Görme
Normalde Maven test sonucunda oluşan hataları C:\appfuse\Source\myproject\target\surefire-reports
Dizininin altina atıyor. Bunun yerine ekranda göstersin istersek:
mvn test -Dsurefire.useFile=false
8.2. XML
mvn jetty:run-war
komutunu çalıştırdığınızda aşağıdakini içeren hata aldıysanız
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error building POM (may not be this project's POM).
Project ID: wsdl4j:wsdl4j
Reason: Failed to build model from file 'C:\Documents and Settings\byazar\.m2\re pository\wsdl4j\wsdl4j\1.6.1\wsdl4j-1.6.1.pom'.
Error: '▌SO-8859-1' for project wsdl4j:wsdl4j
C:\appfuse\.m2\repository\wsdl4j\wsdl4j\1.6.1 deki
wsdl4j-1.6.1.pom dosyasını açıp aşağıdaki kırmızı renkli düzeltmeleri yapın:
8.3. Regional Settings – Turkish
mvn ya da mvn install eclipse:eclipse
komutları çalıştığında aşağıdaki hata oluşabiliyor. Control Panel de Regional Setting İngilizce yapıldığında bu hata oluşmuyor. Daha önceden bu hata oluşmuyordu.
[ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] [talledLocalContainer] at com.opensymphony.module.sitemesh.filter.PageF ilter.parsePage(PageFilter.java:118) [INFO] Error executing ant tasks Embedded error: The following error occurred while executing this line: C:\appfuse\Source\mydeneme\src\test\resources\web-tests.xml:50: JavaScript error loading page http://localhost:8081/mydeneme-1.0-SNAPSHOT/passwordHint.html?username=admin: Wrapped com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException : 500 Internal Server Error for http://localhost:8081/mydeneme-1.0-SNAPSHOT/passwordHint.html (script in http://localhost:8081/mydeneme-1.0-SNAPSHOT/passwordHint.html?username=admin from (88, 337) to (0, 0)#71)
8.4. Mail.properties
Aşağıdaki şekilde bir hata alınırsa C:\appfuse\Source\myproject\src\main\resources
daki mail.properties dosyası açılıp mail bilgilerini girmelisiniz.
PasswordHint:
[INFO] [talledLocalContainer] Jan 4, 2008 6:23:30 PM org.apache.catalina.core.St
andardWrapperValve invoke
[INFO] [talledLocalContainer] SEVERE: Servlet.service() for servlet faces threw
exception
[INFO] [talledLocalContainer] java.lang.NullPointerException
[INFO] [talledLocalContainer] at org.appfuse.service.MailEngine.send(MailEngin
e.java:77)
[INFO] [talledLocalContainer] at org.appfuse.webapp.action.PasswordHint.execut
e(PasswordHint.java:54)
8.5. Connection refused
“java.net.ConnectException
MESSAGE: Connection refused: connect”
Şeklinde hata mesajı alınmış ise Mysql kapalıdır ya da tablolar oluşturulamıyor olabilir.
MySql açtıktan sonra da aynı hata alınırsa oluşturulan tablolar drop edilebilir.
use myproject;
drop table orders;
drop table customer;
9. Appfuse Forum
Herhangi bi hata ile karşılaştıysanız aşağıdaki forumda arayabilir ya da sorabilirsiniz.
http://www.nabble.com/AppFuse-f2369.html
10. Candy for AppFuse
Candy maven komutlarını Eclipse içinden çalıştırmak için kullanılan bir eclipse plugin inidir. Aşağıdaki linklerden kurulumu yapılabilir.
http://candy4appfuse.sourceforge.net/Features.html
http://candy4appfuse.sourceforge.net/Installing.html
File -> New Project ->Appfuse -> New Appfuse Project
Ile yeni bir proje oluşturulabilir. Daha sonra projeye sağ tuş ile tıklayarak aşağıdaki maven komutları eclipse içinden çalıştırılabilir.
11. Örnek
Bir Appfuse projesi oluşturduktan sonra aşağıdaki şekilde örnek bir uygulama geliştirebiliriz. Customer ve Orders şeklinde aşağıdaki şekilde 2 tane sınıfımız ya da database de tablomuz olsun. Bu sınıflara ilişkin kodları oluşturacağız.
(Yukarıdaki UML diyagramı Omondo Eclipse Plug’ini kullanarak hazırlanmıştır.)
Öncelikle
C:\appfuse\Source\myproject deki pom.xml dosyasında versiyonu 2.0.2 yapıyoruz.
Sonra mvn install eclipse:eclipse komutu çalıştırılır.
Eclipse aşağıdaki sınıflar tanımlanır. Sınıflara ait hashCode, equals, toString methodları sağ tuşa basılarak otomatik olarak oluşturulur.
package com.mycompany.app.model;
import org.appfuse.model.BaseObject;
import javax.persistence.*;
import java.util.Collection;
@Entity
public class Customer extends BaseObject {
private Long id;
private String name;
private Collection
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="name", length=50)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(cascade=CascadeType.ALL, mappedBy="customer")
public Collection
return orders;
}
public void setOrders(Collection
this.orders = newValue;
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((id == null) ? 0 : id.hashCode());
result = PRIME * result + ((name == null) ? 0 : name.hashCode());
result = PRIME * result + ((orders == null) ? 0 : orders.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Customer other = (Customer) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (orders == null) {
if (other.orders != null)
return false;
} else if (!orders.equals(other.orders))
return false;
return true;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return null;
}
}
package com.mycompany.app.model;
import org.appfuse.model.BaseObject;
import javax.persistence.*;
@Entity
public class Orders extends BaseObject {
private Long id;
private String address;
private Customer customer;
@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="ORDER_ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="SHIPPING_ADDRESS", length=200)
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@ManyToOne()
@JoinColumn(name="CUSTOMER_ID")
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((address == null) ? 0 : address.hashCode());
result = PRIME * result + ((customer == null) ? 0 : customer.hashCode());
result = PRIME * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Orders other = (Orders) obj;
if (address == null) {
if (other.address != null)
return false;
} else if (!address.equals(other.address))
return false;
if (customer == null) {
if (other.customer != null)
return false;
} else if (!customer.equals(other.customer))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return null;
}
}
Sonra aşağıdaki dosya ya
core/src/main/resources/hibernate.cfg.xml
eklenir.Sonra aşağıdaki komutlar çalıştırılır.
C:\appfuse\Source\myproject>mvn test-compile hibernate3:hbm2ddl
Customer ve Orders için aşağıdakiler çalıştırılır.
C:\appfuse\Source\myproject>mvn appfuse:gen
C:\appfuse\Source\myproject>mvn appfuse:install
Sonra uygulama çalıştırılır.
C:\appfuse\Source\myproject>mvn jetty:run-war
Eclipse de yeni eklenen kodları görmek için proje workspace den kaldırılıp tekrar import edilir.
Çalıştırmak için:
http://localhost:8080/

Görüldüğü gibi customer ve orders için arayüzler oluşturulmuş. Database deki customer ve orders verileri doğru olarak gösteriliyor. Anca kod üretimi çok başarılı olmadığından oluşan sayfalarda hatalar var. Bunlarda manual olarak düzeltilebilir.
Etiketler: appfuse eclipse Java proje altyapı maven


<< Ana Sayfa