2010-05-19 2 views
9

가장 단순한 클래스 클래스 경로에있는 데이터 파일에 대한 Java 클래스의 종속성을 관리하는 방법은 무엇입니까?런타임에 클래스 패스에서 데이터를로드하는 Java 클래스의 데이터 종속성 관리

구체적으로 :
데이터 종속성에 어떻게 주석을 추가해야합니까? Java 주석 (예 : @Data)을 사용하고 있습니까? 아니면 빌드 스크립트 나 속성 파일에 항목을 작성하는 경우가 있습니까? 그러한 정보 (Ant, Scons, ...)를 통합하고 평가하는 도구를 구축하고 있습니까? 예가 있습니까?

다음 시나리오를 고려하십시오.
클래스 경로에있는 모든 것을 포함하는 내 소스에서 Jar 파일을 몇 줄 만들었습니다. 그런 다음 jarjar는 클래스 Foo와 같이 실행할 필요가없는 모든 .class 파일을 제거하는 데 사용됩니다. 문제는 클래스 바가 의존하는 모든 데이터 파일이 여전히 Jar 파일에 있다는 것입니다. 그러나 이상적인 배치 스크립트는 Foo 클래스가 의존하는 데이터 파일을 보유해야하는 동안 Class Bar 만 의존하는 데이터 파일을 제거 할 수 있다는 것을 인식합니다.

힌트가 있습니까?

답변

0

당신이 묘사하는 시스템을위한 일반적인 해결책이 없다고 생각 합니다만, 나는 단지 ASM을 사용하는 클래스에서 주석을 읽을 때 찌르다가 jarjar에서도 사용되기 때문에 생각했습니다. 그런 식으로 주석 데이터를 읽는 것은 어렵지 않습니다 (ClassVisitor를 ClassReader의 accept() 메서드에 전달하고 visitAnnotation 콜백에서 유용한 작업을 수행하십시오). 즉, 의도 한 동작을 jarjar에 포함 시키거나 빌드 프로세스에 사용자 지정 단계로 추가 할 수 있습니다.

+0

이것은 흥미로운 접근 방식입니다. 감사합니다. 전적으로 행복하지는 않습니다. 나는 모든 일을 혼자서해야 할 것이고, 해결책은 독점적 일 것이다. –

0

프로젝트를 리펙토링 할 수 없으므로 프로젝트 자체에 관련된 파일을 각각 포함하는 서브 모듈이 있습니다. Bar 클래스와 Bar 관련 파일은 묶음으로 패키지화되며 Foo 파일은 다른 패키지로 압축됩니다.

또 다른 가능성은 번들을보고 싶은 파일을 필터링 할 수있는 패키지 명명 규칙을 사용하는 것입니다.

+0

이것은 데이터에 대한 클래스의 종속성을 암시 적으로 모델링합니다. 그러나 극단적 인 경우 이는 클래스 당 하나의 프로젝트가 실행 불가능 함을 의미합니다. 또한 내 데이터 종속성이 내 구성 요소 레이아웃을 지정하는 경우 나는 싫어. 다시 말하지만 코드 데이터 의존성을 명시 적으로 모델링하는 데 가장 간단하고 자주 사용되는 방법은 무엇입니까? 당신의 도움을 주셔서 감사합니다! –

1

이것은 많은 문제 중 하나입니다. Maven은 이미 빌드, 종속성 및 리소스 관리로 해결되었습니다. 모든 maven 프로젝트는 'resources'디렉토리에 데이터 파일을 저장해야하는 위치를 지정하는 표준 디렉토리 레이아웃을 따릅니다. 기존 메이븐 디렉토리 구조는 ... 다음과 같다

/ 
/src/ 
/src/main/java/ 
/src/main/java/App.java 
/src/main/resources/ 
/src/main/resources/my.prod.data.or.cfg.or.whatever 
/src/test/java/ 
/src/test/java/AppTest.java 
/src/test/resources/ 
/src/test/resources/my.test.data.or.cfg.or.whatever 
/pom.xml 

이것의 장점은 '주'(자극) 자원 디렉토리에 포함 된 모든 파일을에서 런타임에 응용 프로그램을 사용할 수 있다는 것입니다 Classpath. 모든 '테스트/리소스'파일은 빌드시 & 단위 테스트 시간 동안 코드에서 사용할 수 있지만 최종 아티팩트에는 포함되지 않습니다.

+0

답해 주셔서 고맙습니다. 그러나 문제가 해결되지 않습니다. Maven *이 App.java와 my.prod.data.or.cfg.or.whatever 사이의 종속성에 명시 적으로 주석을 추가합니까? 그리고 Maven이 배포 중에 제외되면 자동으로 Maven을 무시합니까? –

+0

내가 찾고있는 기능을 제공하는 주석이 내장되어 있다는 것을 알지 못합니다. 그러나 위에 설명 된 maven 솔루션을 사용하면 코드 줄을 사용할 수 있습니다. ClassLoader.getSystemResource ("classpath : /my.prod.data.or.cfg.or.whatever ") 'classpath : /'부분은 기본적으로 클래스 경로를 처음부터 살펴 봤으므로 선택 사항이지만 명시 적으로 표현하고 싶습니다.이를 염두에두고 직접 감싸는 주석을 작성하는 것은 너무 어렵지 않습니다 이 구현에 대한 자세한 내용은 ClassLoader API를 참조하십시오. 다른 방법이 있습니다. 올바른 방향으로 도움이되기를 바랍니다. –

+0

코드에서 데이터를 분리하는 것이 좋습니다.하지만 다시 한 번 생각해 보면이 문제를 해결할 수 없습니다. 데이터와 클래스 간의 강력한 연결 결론적으로 Maven은 이것을 지원하지 않는다고 말해야합니다. 해결책을 구현하는 빌드 시스템이 없다고 할 수 있습니까? –

관련 문제