CFML에서 Java 패키지의 버전을 가져오는 방법

10212 단어 cfmlcoldfusionjava
Apache POI library은 스프레드시트를 망칠 수 있는 멋진 도구입니다. 스프레드시트 데이터를 읽고, 머리글 행, 총 행 수, 모든 종류의 별난 것들을 얻을 수 있습니다. Julian Halliwell의 엑설런트spreadsheet-cfml library는 그것을 큰 효과로 사용합니다.

그러나 Apache POI 독립 실행형을 사용하려고 하면 메서드가 존재하지 않는다는 오류가 발생합니다.

No matching Method/Function for org.apache.poi.hssf.usermodel.HSSFSheet.getTables() found


Lucee는 기본적으로 이전 버전의 Apache POI를 번들로 제공하는 것으로 보입니다. (업데이트:

하지만 어떤 버전이 될까요?

물론 Lucee 관리자 페이지에서 쉽게 찾을 수 있습니다. 활성화된 경우.

그러나 코드에서 POI 번들 버전을 가져오지 않는 이유는 무엇입니까? CFML에서?

Lucee에서 Java 패키지 버전 읽기



그것은 모두 자바 클래스로 시작합니다.

createObject( "java", "org.apache.poi.hssf.usermodel.HSSFSheet" )


그런 다음 이 클래스에 연결된 Java 클래스 로더를 가져옵니다.

createObject( "java", "org.apache.poi.hssf.usermodel.HSSFSheet" )
                        .getClass()
                        .getClassLoader()


그런 다음 OSGI 번들을 가져와야 합니다.

createObject( "java", "org.apache.poi.hssf.usermodel.HSSFSheet" )
                        .getClass()
                        .getClassLoader()
                        .getBundle()


마지막으로 버전을 문자열로 가져옵니다.

var version = createObject( "java", "org.apache.poi.hssf.usermodel.HSSFSheet" )
                        .getClass()
                        .getClassLoader()
                        .getBundle()
                        .getVersion()
                        .toString()


짜잔! 패키지 버전이 있습니다! Lucee는 2005년 11월에 출시된 Apache POI 2.5.1과 함께 제공되는 것 같습니다. 와우.

업데이트: Lucee의 BundleInfo() 메서드 사용



Julian Halliwell(멋진 스프레드시트 CFML 라이브러리의 작성자)은 Lucee가 동일한 작업을 수행하는 bundleInfo() 함수를 가지고 있다고 지적했습니다.

Great post! Lucee has a BundleInfo() BIF which also returns other useful info. - Julian Halliwell, @cfsimplicity



bundleInfo()를 사용하면 다음과 같습니다.

var version = createObject( "java", "org.apache.logging.log4j.LogManager" ) ).version;


솔직히 내 도구보다 이게 훨씬 좋다

Adobe ColdFusion에서 Java 패키지 버전 읽기



그러나 Adobe CF(ACF)에서는 ACF가 OSGI를 통해 패키지를 아키텍처화하지 않기 때문에 실패합니다. (제가 아는 바로는 아닙니다.) 우리는 다른 방법을 찾아야 합니다. 그리고 패키지 세부 정보를 읽는 것이 Adobe에서 훨씬 더 간단하다는 것이 밝혀졌습니다.

먼저 Java 패키지 라이브러리를 인스턴스화합니다.

createObject( "java", "java.lang.Package" );


여기에서 Apache POI 패키지를 얻습니다.

createObject( "java", "java.lang.Package" )
            .getPackage( "org.apache.poi" );


POI 패키지가 있으면 구현 버전을 가져올 수 있습니다.

var version = createObject( "java", "java.lang.Package" )
                    .getPackage( "org.apache.poi" )
                    .getImplementationVersion();


그리고 그게 다야!

크로스 엔진 솔루션



슬프게도 두 엔진 간의 Java 패키지 번들 접근 방식의 차이로 인해 이러한 솔루션 중 어느 것도 Lucee와 Adobe ColdFusion 모두에서 작동하지 않습니다.

우리가 얻을 수 있는 최선은 다음과 같습니다.

/**
 * Grab installed version of the bundled Apache POI library.
 */
public string function getApachePOIVersion(){
    if ( server.system.keyExists( "lucee" ) ){
        createObject( "java", "org.apache.poi.hssf.usermodel.HSSFSheet" )
            .getClass()
            .getClassLoader()
            .getBundle()
            .getVersion()
            .toString()
    } else {
        return createObject( "java", "java.lang.Package" )
                            .getPackage( "org.apache.poi" )
                            .getImplementationVersion();
    }
}


안타깝게도 패키지 이름에서 일반적으로 작동하는 크로스 엔진 솔루션에 대한 희망은 거의 없습니다. Adobe에서는 패키지 이름으로 패키지 버전을 확인할 수 있지만 Lucee에서는 특정 패키지 클래스를 검색해야 합니다.

POI 버전 클래스



경고: Apache POI는 버전 3.x에서 "Version"클래스와 함께 제공됩니다. 따라서 내 예는 Apache POI v3 이상에서는 약간 무의미합니다. ACF 10+를 사용 중인 경우 제공된 버전 클래스를 사용하여 버전을 가져올 수 있습니다. Java 패키지 체조가 필요하지 않습니다.

    createObject( "java", "org.apache.poi.Version" ).getVersion()


하지만 이 블로그 게시물의 요점은 아닙니다. 이 게시물은 편리한my.package.Version 클래스가 있는 패키지뿐만 아니라 모든 Java 패키지의 설치된 버전을 읽는 데 도움을 주는 것을 목표로 합니다.

다음 시간까지!

좋은 웹페이지 즐겨찾기