2009-06-22 3 views
0

JVM에서로드 한 모든 Java 패키지의 이름을 가져와야합니다. 이것은 IDE에있는 것과 같은 패키지 브라우저를 표시합니다. ClassLoader 클래스의 보호 된 "패키지"필드에 액세스하여 현재 클래스 로더와 해당 조상의 패키지 목록을 가져올 수 있습니다. 하지만 그들은 자신의 클래스 로더를 가지고 다른 웹 애플 리케이션에 의해로드 된 패키지를 얻을 수 없습니다. Weblogic 서버에서 이것을 테스트하고 있습니다JVM에 의해로드 된 모든 패키지 이름 목록을 얻는 방법

+0

Package.getPackages()가 더 일반적입니다. –

답변

0

getParent()을 사용하여 클래스 로더의 트리를 탐색하고 ClassLoader를 확장하는 모든 클래스를 찾고 현재 인스턴스를 모두 찾습니다 (디버그 API가 도움이 될 것입니다). 하지만 보안 정책 때문에 웹 서버에서는 작동하지 않습니다 (웹 앱은 서로 엿볼 수 없습니다).

Tomcat의 경우 모든 클래스가로드 될 때 기록 할 수있는 옵션이 있습니다. 이렇게하면 서버 속도는 상당히 느려지지만 개발 서버에서는 옵션 일 수 있습니다.

그건 그렇고, 왜 내가 필요한지 궁금합니다. 가장 간단한 해결책은 jar tvf으로 앱이 가져 오는 모든 JAR 파일을 나열하고 경로의 마지막 부분 (클래스 파일)을 제거하는 것입니다.

1

Weblogic 보안 모델의 예상되는 동작은 다른 웹 응용 프로그램의 클래스 로더에 액세스 할 수 없다는 것입니다. 이것은 실제로 얻을 수있는 것이 아닙니다. 자세한 내용은 this article을 참조하십시오.

+0

나는 또한 그가 무슨 일을하는지 궁금해. 어쩌면 그는 다른 사람들의 웹 앱을 보안 구멍으로 스캔하는 방법을 찾으려고 할 것입니다. –

+0

그는 몇몇 라이브러리가 어떤 라이브러리를 사용하고 있는지 파악하려고 노력 중일 수도 있습니다. JMX 관리자가 이런 종류의 정보를 찾을 수 없습니까? – ThaDon

+0

나는 정말로 확신 할 수 없다 - 만약 그들이 할 수 있다면 게시해라, 나는 분명히 나의 표를 가질 것이다. – stevedbrown

0

내가 이것을 할 수있는 유일한 방법은 각 webapp을 수정하여로드 된 클래스 정보에 대한 각각의 요청을 보낼 수 있도록하는 것입니다. 그런 다음 기존 웹 응용 프로그램의 응답을 결합하여 표시 할 수있는 새로운 웹 응용 프로그램을 만들 수 있습니다.

멋진 UI에서이 정보가 필요하지 않다면 Sun JVM에는 클래스 로딩과 관련된 내용을 보여주는 -XX vm 옵션이 있습니다.

http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

내가하는 JRockit에 익숙한 아니에요하지만 비슷한 옵션을 가지고 있지 않은 경우에 나는 놀랠 것입니다.

0

좋아요. Weblogic에서이 기능을 사용할 수있었습니다. 다시 한 번 내 목표는 주어진 WebLogic 서버에 전개 된 모든 애플리케이션에서 Java 패키지 이름을 얻는 것이 었습니다. 왜? 내 이유가 있었어 :)

먼저 모든 배포 된 응용 프로그램의 귀, 전쟁 또는 jar 파일 위치를 확보해야합니다. 이를 위해 WebLogic에서 AppDeployment MBeans를 가져 와서 아래와 같이 반복합니다. 우리가 전쟁, 귀, 항아리 또는 폭발 폴더의 경로를 얻을 모든 작업을 수행하는 PackageFinder 클래스의 findPakages 방법에 전달 위의 코드에서

Set<ObjectName> set = utils.getConfigMBeansByType("AppDeployment"); 
    for (ObjectName objectName : set) { 
     String name = objectName.getKeyProperty("Name");    

     if (!appCache.contains(name)) { 
      //System.out.println("Config bean: " + objectName); 
      Object path = utils.getPropertyValue(objectName, 
        "AbsoluteSourcePath"); 
      //System.out.println("Path: " + path); 
      if(path != null){ 
       PackageFinder finder = new PackageFinder(); 
       packages.addAll(finder.findPackages(path.toString())); 
      } 
      appCache.add(name); 
     } 
    } 

.

public Set<String> findPackages(String path){ 
    File file = new File(path); 
    if(file.exists() && file.isFile()){ 
     InputStream in = null; 
     try { 
      in = new BufferedInputStream(new FileInputStream(file)); 
      if(path.toLowerCase().endsWith(".war")){ 
       processWar(in); 
      }else if(path.toLowerCase().endsWith(".ear")){ 
       processEar(in); 
      }/* 
    Rest of the method body removed, I guess you get the idea 
    */    
    return packageNames; 

} 


public void processJar(InputStream in){ 
    ZipInputStream zin = null; 
    try { 
     zin = new ZipInputStream(in); 
     ZipEntry entry; 
     while((entry = zin.getNextEntry()) != null){ 
      if(entry.getName().endsWith(".class")){ 
       addPackage(entry.getName()); 
      } 
     } 
    } catch (Exception e) { 
    } 
} 
+0

주 : 이것은 JVM에서로드 된 모든 클래스의 패키지 이름을 리턴하지 않습니다. 내 목적에 부합하는 WebLogic 서버에서 배포 된 모든 응용 프로그램과 함께 번들로 제공되는 클래스의 모든 패키지 이름을 반환합니다. – maneesh

관련 문제