2017-01-30 11 views
6

사용 가능한 모든 클래스 (인터페이스, 주석 등)를 검색하는 것이 런타임에서 가능한지, 스프링, 반사 및 다른 많은 프레임 워크 및 라이브러리는 현재 클래스가로드되는 방식에 대한 Jigsaw 관련 변경 사항에 대해 현재 수행하고 있습니다.Java에서 런타임시 classpath/modulepath를 검색 중입니다.

편집 : 이 질문에 대한 스캔 클래스를 찾고 실제 실제 파일 경로입니다. The other question은 동적으로 약 이고, 클래스 및 리소스는입니다. 그것은 관련이 있지만 대단히 아니요 중복입니다.

UPDATE : 부두 프로젝트는 이에 대한 표준화 된 API에 대한 JEP proposal했다. 이 현실을 돕는 방법이 있다면 제발. 그렇지 않으면, 기다리고 희망을 품을 수 있습니다.

+0

많은 변화가 없다고 생각합니다. 다른 모듈에 대한 모듈의 가시성이 있다면, 여전히 일반적인 것을 할 수 있습니다. 혹시 모듈에서 클래스에 접근 할 수 없다면'InaccessibleObjectException' 또는 이와 비슷한 예외가 발생할 것입니다 – Eugene

+0

@Eugene 정말요? 클래스 패스가 이제는 "레거시 (legacy)"일 것 같아서, _modulepath_로 대체되었습니다. 그래서 나는 클래스 패스로 사용되던 것들을 바꾼 것으로 추측하고 있습니다. – kaqqao

+0

[Java 9에서 클래스와 리소스를로드 중입니다.] (https://stackoverflow.com/questions/45166757/loading-classes-and-resources- in-java-9) –

답변

6

나는 이것을 FastClasspathScanner으로 알아 내려고하고있다. 지금까지 시스템이 모듈을 찾고 해결하는 방법에서 찾은 최상의 정보는 here이며, 관찰 가능한 모듈 목록을 얻으려는 코드는 java8-jigsaw-depvis 프로젝트에서 here입니다. 각 ModuleReference에서 URL 필드를 가져온 다음 모듈 루트 내의 각 디렉토리 또는 jar를 전통적인 클래스 패스의 요소 인 것처럼 수동으로 스캔 할 수 있습니다. 수동으로 스캔하는 경우에는 추가 정보가 필요하지 않을 수도 있습니다. 디렉터리 또는 모듈러 jarfile의 루트에있는 module-info.class (예 : 가시성 정보에 대해 exports 정의 읽기). ModuleReference을 사용하여 각 모듈의 리소스를 나열한 다음 모듈로드 시스템을 사용하여 InputStream 또는 ByteBuffer의 각 명명 된 리소스의 내용을 제공 할 수도 있습니다.

어느 시점에서이 모든 내용은 FastClasspathScanner에서 투명하게 지원되지만 여기서는 많은 것들이 있습니다. 모듈리스트를 얻고 그것들을 스캔하고, 클래스 로더를 무시하거나, 클래스 로더가 여전히 스캔되어야하는지에 대해서 충분합니까? (클래스 패스 URL에 대해서도 클래스 로더를 스캔 할 필요가 있습니다. 커멘드 라인으로부터 클래스 패스에 전통적인 jar 파일을 추가하는 것이 가능할 가능성이 있습니다.)

+1

굉장한, 마침내 진짜 단서! 이것에 대해 고마워요! – kaqqao

+1

다음은 같은 저자의보다 상세한 조사입니다 : https://github.com/lukehutch/fast-classpath-scanner/issues/36 – Vadzim

1

실제의 문제는, 다음의 모든 jar와 폴더의 패스를 검색하는 것입니다. classpath. 일단 가지고 있으면 스캔 할 수 있습니다.

  • MANIFEST.MF
  • 의 이러한 각 모듈 열려있는 자원에 대한 모든 requires 모듈을
  • 을 얻을 현재 클래스에 대한 현재 모듈 설명을 얻을 MANIFEST.MF 경로를 제거 : 내가 무슨 짓을

    는 다음과 리소스 URL에서

  • 모듈의 클래스 경로, 즉 jar 또는 폴더가 남아 있습니다.

현재 코드에서 클래스 경로를 얻으려면 현재 모듈에서 동일한 작업을 수행하십시오.

이 방법으로 현재 작동중인 모듈과 모든 필수 모듈 (1 단계 거리)의 classpath를 수집합니다. 그건 저를 위해 일하고 있었고 제 Java8 스캐너는 여전히 그 일을 할 수있었습니다.이 접근법은 추가적인 VM 플래그 등을 필요로하지 않습니다.

모든 모듈을 쉽게 (첫 번째 레벨뿐만 아니라) 얻을 수 있지만, 지금은 필요하지 않습니다.

Code.