2009-02-20 4 views
8

개발자로서, 나는 종종 당신의 삶을 편하게 할 수있는 새로운 언어 기능에 관심이 있습니다. 예를 들어, java 5는 제네릭과 주석을 언어로 가져 왔으며, 생산성을 확실히 높일 수 있습니다.플랫폼 강제적 인 버전 관리 메커니즘이 Java의 가장 중요한 기능입니까?

그러나 Java 플랫폼에서 10 년 가까이 작업 한 것을 되돌아 보면, 버전 관련 문제가 비생산적이며 불필요하게 낭비되는 노력의 가장 큰 원인입니다. 올바른 버전의 jar 파일을 찾고, 일부 버전 충돌을 조정하고, 종속 라이브러리를 업그레이드하는 데 몇 시간이 걸렸습니다. Java에서 작업을 시작했을 때 그다지 어렵지 않았습니다. 몇 가지 타사 라이브러리가있을 것입니다. . 오늘날 전형적인 웹 애플리케이션은 Spring Framework, Hibernate, Struts 등을 쉽게 사용할 수 있습니다. 이들 모두는 많은 수의 제 3 자 라이브러리를 가지고 있습니다. 현재 귀에 보관 된 파일에는 일반적으로 약 40 개 이상의 제 3 자 라이브러리가 포함됩니다. 진짜 병동이야!

주석을 사용하면 Hibernate의 설정 파일을 관리 할 필요가 없습니다. 좋은 기능이지만, 필자는 설명자를 별도의 파일에 보관한다는 사실로 인해 많은 문제가 발생하는 것을 보지 못했습니다. 제네릭을 사용하면 캐스트 문을 쓰지 않아도되지만 프로그래밍 캐리어 전체에서는 형식이 안전한 컨테이너를 사용하여 예방할 수있는 버그 하나를 기억할 수 없습니다. 버전 문제에 대한 해결책이 훨씬 더 가치가 있었습니까?

이러한 모든 문제

는 이러한 도구 중 일부를 사용하더라도에도 적절히 등 Jar Hell 이름, Maven 같은 도구의 수, ivy, One Jar, Jar Jar Links (농담하지!)시킬 수도, 당신은에 면역되는 거리가 멀다 문제. 나는 Maven 2를 사용하며 큰 도움이되었습니다. 아직도, 그것은 그 자체로 세계입니다. 초보 프로그래머는 그것을 배우기까지 시간이 걸릴 수 있습니다. 레거시 프로젝트를 Maven 구조로 옮기는 것도 쉽지 않습니다.

.Net에서 그들은 dll 지옥으로 교훈을 얻었으며 닷넷 어셈블리 관리가 훨씬 간단하다고 생각합니다.

Java 플랫폼 및 OSGI와 같은 대안에 대해이 문제를 해결할 계획이있는 것으로 보입니다. 기본 및 플랫폼에 따른 강제적 인 버전 관리 메커니즘이 절실히 필요하다고 생각합니다.

+0

이것은 해설보다 더 많이 읽습니다. – cletus

+0

나는 둘 다 (해설과 호언 장담)의 조금다는 것을 나는 짐작한다. 저는 다른 사람들이 I와 같은 고통을 겪고 있는지를 기본적으로보고 싶었습니다. 수년 동안 지금은 팀 구성원들에게 가장 절실히 필요했습니다. 나는이 문제에 대한 효율적인 해결책이 없다는 사실에 좌절감을 느낍니다. – Dan

+0

Rant 또는 not, 그것은 여전히 ​​합법적 인 질문입니다. 게시물의 본문에서 질문이 반복되지 않아도 적어도 제목은 있습니다. – tvanfosson

답변

4

OSGi - 번들 (jar)의 버전 관리와 관리를 매우 잘 처리합니다.

ALSO : Eclipse (OSGi 위에 구축 됨)에는 API를 이전 기준선과 비교하고 번들의 다음 버전 번호를 올바르게 표현하는 방법을 결정하는 데 도움이되는 비교적 새로운 API 도구가 있습니다.

일반 일식 버전 방식 :

v.m.n.q 

V : 높은 수준의 버전 - 변경 여기에 일반적으로

m API에서 변경을 깨는 나타냅니다 큰 변화 - 새로운 기능을, 새 API

n : 사소한 변경 - 동일한 API, 백그라운드 변경 사항

q : 한정자 - 빌드, 알파/베타 등을 표시하는 데 유용합니다.

OSGi는 범위를 사용하여 버전 종속성을 지정합니다.예를 들어 당신의 MANIFEST.MF에

Require-Bundle: com.javadude.foo;bundle-version="[1.2.0,2.0.0)" 

은 번들가 버전 2.0.0 (그러나 포함하지 않음)을 통해 나중에 번들 com.javadude.foo 버전 1.2.0 이상이 필요하도록 지정합니다.

패키지 수준에서 종속성을 지정할 수도 있습니다.

+0

OSGI에 대해 알고 있지만 더 자세히 보지 않았다. 나는 내가 직면하고있는 특정한 문제에 대해 과잉 행동할 수 있다는 인상을 받았다. 나는 그것이 두 번째 모습을 준 때라고 생각한다. – Dan

+0

실제로 꽤 가볍습니다. 이 가장 기본이므로 번들 종속성을 관리하는 데 사용할 수 있습니다. 다른 번들에 대한 서비스를 제공하는 데 사용할 수도 있습니다. –

0

.NET에 비해 Java가 갖는 이점은 라이브러리가 OS와 더 밀접하게 관련되어 있다는 것입니다. 프레임 워크 라이브러리가 설치되어있는 경우 GAC에 쉽게 위치한다는 사실은 작업을 단순화하지만 실제로는 Windows에만 국한됩니다. 더 나은 비교는 Mono 일 것이지만, 나는 그곳에서 어떠한 경험도하지 못합니다.

최소한 구성 관리는 항상 소프트웨어 개발의 큰 고통이었습니다. 기존 코드를 더 많이 사용할수록 더 나빠질 것입니다. 문제 자체는 자바에 고유하지 않지만 버전의 확산, 플랫폼의 사용 시간, 지원되는 플랫폼의 수는 더 나빠질 것으로 보입니다. 방금 확인한 바에는 JRE 3 버전이 있습니다. 현재 Java 개발자가 아닙니다.

귀하의 질문에 관해서는, 그것이 가장 절박한 기능이 필요한지 확실하지 않습니다. 개인적으로 웹 서비스, 특히 인증 헤더를 필요로하는 웹 서비스에 대한 더 나은 지원을보고 싶습니다. 자바를 .NET 웹 서비스 중 하나와 상호 작용 시키려고 시도한 마지막 때, 나는 거의 내 머리를 찢어 버렸다. LINQ를 C#/Net과 함께 사용해 본 결과, Java에 대한 멋진 기능이 추가되어 생산성 향상이 가능할 것이라고합니다.

+0

JSR 277 (http://www.jcp.org/en/jsr/detail?id=277)의 배경에는 비슷한 해결책이 포함되어 있지만 휴면 모드 인 것 같습니다. – Dan

+0

OSGi (http://www.osgi.org/Main/HomePage)는 JSR 277의 많은 이점을 이미 실제로 존재한다는 장점을 추가로 제공한다고 생각합니다. 복잡하지는 않습니다. –

0

.NET은 side-by-side 어셈블리를 지원하므로 동일한 응용 프로그램의 여러 버전을 사용할 수 있습니다. GAC는 공유 DLL과 비슷하지만 GAC에서 동일한 어셈블리의 여러 버전을 등록 할 수 있으며 잘 기억하면 다른 어셈블리가 특정 버전 또는 상위 버전을 요청할 수 있습니다.JavaEE에서 몇 가지 클래스 로더 레벨 btw가 있고 비슷한 버전 관리를 시뮬레이션하는 몇 가지 트릭을 수행 할 수 있습니다.

+0

그러나 동일한 VM에서 동일한 어셈블리의 다른 버전을 지원합니까? –

5

저는 10 년 넘게 Java를 사용해 왔지만 많은 것을 찾지 못했습니다. JAR 지옥 모든 문제 (언급 한 모든 타사 도구 사용)! Maven은 끔찍한 도구이므로, ant으로 모든 것을 빌드하십시오. 우리의 회사에서

우리는 어느 쪽 app 또는 lib (혹시 lib에 따라 다릅니다 만한다 각 프로젝트를 정의와 함께, 각 프로젝트에 대한 간단한 (작은) 종속 파일을 기반으로 맞춤 의존성 해상도 ant 작업이 결코 app). 그것은 잘 작동합니다.

이클립스 .classpath 및 IDEA .iml 파일을 수정하여 우리의 IDE에 대한 종속성 그래프를 생성하는 작업도 있습니다.

+0

빌드 시스템에 Ivy를 통합 할 가치가 있습니다. 그것은 기본적으로 나머지를 던져 버리는 동안 maven의 의존성 해결 메커니즘을 필요로합니다 - http://ant.apache.org/ivy/ – Evan

+0

또한 Eclipse에 대한 플러그인도 있습니다 - http://ant.apache.org/ivy/ivyde/ – Evan

+0

내가보기에 기쁜 것은 내가 밖에있는 유일한 피난처가 아니다 ... –

0

내가 일한 사이트에서이 문제가 발생했습니다. 웹 서버에있는 jar 파일을 실행하고 jar 파일의 모든 중첩 복사본을 찾고 동일한 이름을 가진 다른 파일을 찾는 도구를 만들었습니다 (예 : versions log4j.jar). 그것은 WebLogic 뚜껑 안에 내부에있는 하나의 WAR를 포함하여 끔찍한 엉망이었습니다.

해결 방법이 확실하지 않습니다.

설명 : java 에는이 있습니다. 패키지 버전이있는 스탬프가있는 jar 파일입니다. 특히 : webstart. 아마도 필요한 것은 웹 스타트 형식의 일을하는 일종의 클래스 로더 일 것입니다.

대략 : JAR 매니페스트에서 잘 알려진 이름과 버전을 사용하여 라이브러리 종속성을 지정합니다. 컨테이너 또는 런타임에서 제공하는 클래스 로더는 원하는 버전을 가져와야합니다.

라이브러리를 다운로드 할 수있는 잘 알려진 장소를 관리 할 수있는 많은 시스템 (예 : Maven 자체)은 물론, 분노와 기타 등등이 있습니다.