Salı, Aralık 19, 2006

Jar Finder

J2EE uygulama geliştiricilerin en çok yaşadığı problemlerden biri de class uyuşmazlıklarıdır. Özellikle uygulamalarınızda çok fazla open-source library var ise veya uygulamanızın çalıştığı Uygulama Sunucusundaki tüm uygulamalar jar dosyalarını global classpath'e tanımlatıyorsa daha fazla yaşanır.

Class uyuşmazlıklarının en büyük nedeni classpath'de aynı class'ın birden çok farklı versiyonunun bulunmasıdır. JVM classpath'te aynı class'tan 2 tane bulunmasına kızmaz. Önce hangisini yükledi ise onu kullanır diğerini es geçer ve bu konuda da bir hata veya uyarı mesajı atmaz. JVM'in ve Uygulama Sunucularının Class yüklerken kullandığı bir hiyerarşi ve mantık vardır. Bu konuda en güzel bilgiyi Weblogic Server Application Classloading dokümanında bulabilirsiniz.


Aynı classpath'te farklı versiyondaki classlar yüzünde uygulamalarınız garip davranışlar gösterebilir ve siz de sorun nerde diye arar durursunuz. İşte bu durumdan şüphelendiğiniz an yapmanız gereken class'ınızın hangi jar'dan yüklendiğini bulmak. Bunun için yapmanız gereken aşağıdaki jsp'yi class'ınızı çağırdığınız ear/war içine koyup deploy etmek ve çalıştırmak.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Determining from Where a Class Was Loaded</title></head>
<body>
<form method=get>Please enter fully qualified class name (e.g. oracle.jdbc.driver.OracleDriver )<br>
<b> ClassName : </b> <input name="className" maxlength=255 size=40 value="" type=text> <input type=submit value=Find>
</form>
<%
String className = request.getParameter("className");
if(className != null) {
try
{
Class clazz = Class.forName(className);
java.security.ProtectionDomain pDomain = clazz.getProtectionDomain();

java.security.CodeSource cSource = pDomain.getCodeSource();

java.net.URL loc = cSource.getLocation();

String result = loc.getFile();


out.println("<b>Path : "+result+"</b>");
}catch (Throwable e)
{
out.println(e.getMessage());
}
}
%>
</body>
</html>


Bu jsp size class'ınızın hangi jar dosyasından yüklendiğini tam olarak gösterecektir. Eğer benim sorunum bir class'tan 2 tane olması değil hiç olmaması diyorsanız ve "Class Not Found" hatası veren class'ın hangi jar'a jar'a ait olduğunu bulmak istiyorsanız o zaman www.jarfinder.com 'a başvuracaksınız:

www.jarfinder.com
Our database currently contains over 250,000 classes from java projects such as apache, spring, jboss and many more. If you know of a library that we don't currently index please see our help section for details of how to add it to the database.

2 Yorum:

Blogger Uysal KARA dedi ki...

projeleri maven veya ant gibi bir araçla düzenlersek classpath sorunlarından bir nebze kurtulabiliriz.
Eğer hala bir problem varsa
[Jar class finder]
http://www.eclipseplugincentral.com/displayarticle234.html
aracını kullanabiliriz..

10:59 ÖÖ  
Anonymous Adsız dedi ki...

which4j ile de aynı şekilde
Which4J.which(Kullanilan.class)
bulunabilir.

Remzi

8:57 ÖÖ  

Yorum Gönder

Kaydol: Kayıt Yorumları [Atom]

<< Ana Sayfa