문제

우리는 2010 년 말까지 java2se v1.4에 갇혀 있습니다. 정말 불쾌하지만 도울 수는 없습니다. 현재 이미 새로운 기능을 사용해야하는 옵션은 무엇입니까? 나는 여러 가지 방법을 생각할 수 있습니다

  • 바이트 코드 변경, 예를 들어 사용 레트로 트랜스 레이터 또는 Retroweaver.

  • 도서관의 백 포트, 예를 들어 동시 백포트, 그러나 이것은 제네릭에 도움이되지 않습니다.

  • Java 5 기능의 에뮬레이션, 예를 들어 확인 된 컬렉션, 도우미 방법이있는 Varargs 등

  • 사전 컴파일에 의한 소스 코드 변경, 최종 컴파일 전에 1.5 항목을 모두 벗기는 등 거부자 이것을 할 수 있습니다.

나는 웹 로그와 "실제"물건을 사용하여 생산 환경에서 그것에 대한 매우 긍정적 인 경험에 가장 관심이 있습니다.

도움이 되었습니까?

해결책

답변 해주셔서 감사합니다. 다음은 모든 관련 답변과 내 연구의 요약입니다.

바이트 코드 변경 : 레트로
이것은 이에 의해 수행됩니다 "레트로"-툴: 레트로 트랜스 레이터, Retroweaver 그리고 Jbossretro. 레트로 트랜 슬라이서는 가장 성숙하고 활동적인 도구 인 것 같습니다. 이 도구는 모든 클래스를 스캔하고 바이트 코드를 변경하여 Java 5 및 6 기능을 제거합니다. 많은 Java5 기능은 제 3 자 백 포트 라이브러리를 사용하여 지원됩니다. 이 옵션은 가장 인기가 있으며 사용자의 긍정적 인 피드백이 있습니다. 실험에 따르면 예상대로 작동하는 것으로 나타났습니다. 짧은 개요를 참조하십시오 DeveloperWorks.

Pro : Java 5에서 완전히 개발하고 모듈을 빌드 및 모든 종류의 항아리를 만들 수 있습니다. 결국 당신은 모든 클래스를 Java 1.4로 변환하고 귀를 포장합니다. 이것은 레트로 트랜스 레이터의 Maven 통합으로 쉽게 수행됩니다 (org.codehaus.mojo:retrotranslator-maven-plugin).

CON : 보수적 인 환경은 변경된 바이트 코드를 배치 할 수 없습니다. 레트로 단계의 결과는 코더에게는 보이지 않으며 승인을받을 수 없습니다. 두 번째 문제는 두려움입니다. 비밀스러운 생산 문제가있을 수 있으며 레트로 코드는 또 다른 단계 일 수 있습니다. 앱 서버 공급 업체는 바이트 코드 변경으로 인해 도움을 거부 할 수 있습니다. 따라서 아무도 생산에 그것을 사용할 책임을 갖고 싶어하지 않습니다. 이것은 기술적 인 문제보다 경찰이므로 해결책이 없습니다. 그것은 우리에게 일어났다. 그래서 나는 추가 옵션을 찾고 있었다 :-(

Java5를 Java 1.4로 컴파일합니다 : JSR14
지원되지 않는 옵션이 있습니다. javac -source 1.5 and -target jsr14 Java5 소스를 유효한 Java 1.4 바이트 코드로 컴파일합니다. Varargs 또는 Loop for Loop과 같은 대부분의 기능은 컴파일러에 의해 번역됩니다. 제네릭과 주석이 제거되었습니다. 열거는 지원되지 않으며 오토 옥싱에 대해 모릅니다. valueOf 방법은 주로 Java5에 도입되었다.

CON : 바이트 코드 만 번역되고 라이브러리 사용이 변경되지 않습니다. 따라서 Java5 특정 API를 사용하지 않도록주의해야하지만 백 포트를 사용할 수 있습니다. 또한 개발 시간 동안 일반 및 주석 정보가 포함 된 Java5 코드를 원하기 때문에 모든 모듈을 동시에 구축해야합니다. 따라서 Java 1.4 프로덕션을 위해 전체 프로젝트를 처음부터 구축해야합니다.

소스 변경 Java 1.4 : Declawer
a 관련 질문, 거기 있습니다 거부자, 제네릭 및 바라크에 적합하지만 루프 또는자가 옥시 링 용으로는 작동하지 않는 컴파일러 확장자입니다. 생성 된 소스는 "약간 펑키하지만 너무 나쁘지는 않습니다".

프로 : 생성 된 소스를 사용할 수 있으며 검토 할 수 있습니다. 최악의 경우이 소스에서 수정을 할 수 있습니다. 소스가 유효한 Java이기 때문에 "마법"은 없습니다. 어떤 사람들은 JAD (Java Decompiler)를 사용하여 Java 1.4 소스를 다시 얻습니다. Debug 정보를 컴파일하고 내부 클래스를 사용하지 않으면 JAD 판독 가능의 출력이 읽을 수 있습니다.

CON : 비슷합니다 -target jsr14, 배포에 추가 단계가 필요합니다. 라이브러리와 동일한 문제도 있습니다.

소스를 Java 1.4로 다시 변경합니다
몇 가지 답변이 손으로 할 것을 제안했습니다. 자동적이고 반복되는 빌드 프로세스의 경우 물론 유용하지 않지만 일회성 변경의 경우 합리적입니다. 가능한 것을 자동화하십시오. 아마도 집에서 재배 한 전환 도구를 만들기 위해 ANTLR을 살펴보십시오.

백포링 된 라이브러리 :
문제는 Java5가 새로운 도서관을 배송한다는 것입니다. 관련 질문. 다행히도 Java5의 기능을 제공하지만 제네릭과 같은 언어 기능을 시뮬레이션 할 수없는 몇 가지 백 포트 라이브러리가 있습니다.

  • 주석, 논의 TSS
  • 병발 사정
  • com.sun.net.httpserver (Java 6 ~ 5)
  • GIF 작문 (Java 6 ~ 5)
  • 나만의 백 포트 프로젝트를 시작하십시오 ;-)
  • JDK 또는 기타 라이브러리에서 필요한 클래스를 복사 할 수도 있지만 다른 클래스와 관련이있을 가능성이 높습니다.

Java 1.4 코드의 Java5 기능 에뮬레이션 :
나는 당신의 삶을 더 쉽게 만들고 여전히 Java 1.4를 유지하기 위해 당신이 할 수있는 일에 대해 생각하고있었습니다. 가장 중요한 기능은 TypeSafe 컬렉션입니다. 몇 가지 아이디어가 있습니다.

  • 제네릭을 사용하는 대신 템플릿으로 자신의 TypeSafe 컨테이너를 만들 수 있습니다.
  • TypeSafe Iterator를 추가하십시오 (더 이상 반복자가 없음).
  • 추가하다 asList 허용하는 방법 1,2,...,n 인수와 그 배열 (Varargs를 시뮬레이션하기 위해).
  • Varargs를위한 방법 (변환 1,...,n 배열에 대한 인수) 및 valueOf 일부 도우미 수업에 넣을 수 있습니다.

다른 팁

Sourcecode 사전 컴파일, 최종 컴파일 및 배포 전에 1.5 항목을 모두 제거합니다. 이를 수행 할 수있는 도구가 있습니까?

예. 그것들은 레트로 트랜스 레이터 또는 Retroweaver라고합니다. 제네릭 외에도 (어쨌든 컴파일러를 위해서만 존재 함) 단순히 "1.5 물건을 스트립"할 수는 없습니다. 열거 (및 아마도 다른 기능)는 기능적으로 동등한 코드로 대체해야합니다. 이것이 바로 그 도구가하는 일입니다.

JDK 1.5 기능으로 코딩 할 수 있습니다 컴파일 시간에 JDK 1.4를 대상으로합니다. 사용 가능한 Javac 옵션을 참조하십시오. 그러나 대부분의 라이브러리는 이제 JDK 1.5 코드를 사용하고 있으므로 오래된 Libs가 있습니다.

Java 1.4는 한동안 EOL 이었다는 점은 주목할 가치가 있습니다. Java 5.0은 2009 년 10 월 8 일 EOL이 될 것입니다. 누군가가 당신에게 2010 년까지 Java 5.0을 약속한다면, 왜 그런지 물어볼 것입니까?!

Java 1.4의 주석을 시뮬레이션하려면 사용할 수 있습니다 http://xdoclet.sourceforge.net/xdoclet/index.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top