Java 6에서 Java 7 로의 마이그레이션을 정당화하는 방법은 무엇입니까?


28

우리는 Java 6 에서 Java 7 로 마이그레이션하고있었습니다 . 프로젝트가 예정보다 늦어지고 위험이 줄어드는 경우 Java 6을 계속 사용합니다.

JDK 7을 사용하는 것이 중요하다는 확신을 가지고 관리자에게 되돌아 갈 수있는 Java 7의 특정 개선 사항은 무엇입니까? Oracle Java 7에서 강조 할 수있는 버그 수정 (Java 6 관련)을 찾고 있습니다. 보안, 성능, Java 2D / printing 등의 수정 사항은 필자의 경우 더 많이 팔릴 수 있습니다. 예를 들어 컴파일러 수정은 많이 사용되지 않습니다.

[ Oracle 채택 가이드 , 버그 데이터베이스, Stack Overflow에 대한 질문 과 같은 많은 사이트를 살펴 보고 있습니다 ].

업데이트 : 답변 주셔서 감사합니다. 다음 릴리스로 업데이트 일정을 변경했습니다. 가장 가까운 것은 보안이었습니다. 가장 높은 투표 응답을 수락합니다.


5
당신은 운이 좋다. Stack Overflow 에 여전히 정기적으로 나타나는 질문 에서 일부 사람들은 여전히 ​​Java 1.4 (11 세의 플랫폼)에 갇혀 있습니다.
Joachim Sauer

3
7의 일부 기능에 대해 아직 모르는 경우 왜 지금 업그레이드를 수행합니까? 어쩌면 당신은 당신의 시간을 낭비하고 당신이 그것을 정당화하는 방법 보다는 그것을 정당화 해야하는지 에 대해 조금 더 생각 해야 할 것입니다.
Bryan Oakley

1
그냥 나인가요 아니면 제목이 거꾸로입니까?
Radu Murzea

1
더 큰 문제는 왜 업그레이드가 어려운가? 일주일에 백만 개의 loc 프로젝트를 Java 7로 업그레이드 할 수있었습니다. 문제에 대한 답은 왜 업그레이드가 어려운지 분석하는 것입니다.
Andrew T

2
@ Andrew Finnell : 죄송합니다. 나는 그것이 그와 관련이 있다고 생각하지 않았다. 실제 포팅은 일주일 이내에 완료되었습니다. 주로 태양 독점 API로 인해 사용했습니다. 실제 코드 행 수 (약 4 백만)보다 코드에 영향을받는 함수 별 호환성이었습니다. 지연은 툴 지원과 같은 다양한 요인으로 인해 발생했습니다 (예 : cobertura 2.0을 사용한 코드 적용 범위). 그냥 안정화되고 있습니다. 또 다른 도구는 업그레이드가 필요한 Rational Functional Tester였습니다 (우리는 선택하지 않았습니다). 노력에 영향을 미치는 전체 요소에 대한 메모를 작성하겠습니다.
Jayan

답변:


44

Java 6은 올해 2 월 EOL에 도달했으며 값 비싼 엔터프라이즈 지원을 구매하지 않으면 더 이상 공개 업데이트 (보안 포함)를받지 않습니다.

그것이 필요한 모든 이유가되어야합니다.

게다가 압도적 인 증거는 Java 런타임에 대한 이전 버전과의 호환성이 우수하다는 것을 시사합니다. Java 6 설치를 Java 7로 바꾸면 모든 응용 프로그램이 아무런 문제없이 계속 작동합니다. 물론 이것은 보장되지 않으며 실제로 아무런 문제가 없음을 확인하기 위해 광범위한 테스트가 권장됩니다.


2
그 대답은 받아 들여 져야합니다. EOL 날짜 기반 추론은 특히 Java를 포함한 특정 제품 업데이트를 정당화 할 필요가있을 때마다 가장 잘 작동하는 것으로 입증되었습니다. 정당성을 완성하기 위해 이전 바이너리 호환성 (일부 공식 Oracle 문으로 백업)에 대한 메모와 업데이트를 연기 테스트 할 필요성에 대한 메모를 추가합니다 (예 : 하드 코딩 된 버전에 대한 예상치 못한 종속성 " 응용 프로그램 구성에서 6 ")
gnat

1
기본적으로 대부분의 회사가 업그레이드 할 유일한 이유입니다.
jwenting

마이클, 내가 언급 한 메모 ( 호환성 및 연기 테스트에 대한 설명 )를 답변 에 추가하는 것이 합리적 입니까? 완전성을 위해 말하기
gnat

1
@gnat : 완료 되었음에도 불구하고 마이그레이션에 반대하는 사람들에게 연기 테스트뿐만 아니라 테스트의 필요성에 대해 이야기해야한다고 의심합니다. 가장 심각한 비 호환성 이있는 경우 가 있습니다 .
Michael Borgwardt

@MichaelBorgwardt는 그것에 대해 말하기가 다소 까다 롭고 기술적으로 정확하기보다는 설득력이 있어야합니다. 나는 한 사람이 "변화를 맞이하는"사람들이있을 때 명시적이고 분명하게 진술하는 다소 어려운 방법을 배웠다. 이런 종류의 신호를 보내면 "우리는 여러분의 우려를 듣고 공유하며 걱정합니다."라고 생각하고 (무시되는 것이 아니라) 가치를 느끼게하고 결국에는 변화에 대한 승인을 더 쉽게받습니다.)
gnat

29

일반적으로 프로그래머가 쉽게 할 수 있도록 상당히 광범위하게 변경되었습니다. 관리자는 그러한 일에 너무 신경 쓰지 않을 수도 있지만 프로그래머가 상용구 코드에 대해 생각하는 데 시간을 덜 소비하므로 구현하는 실제 목표에 대해 생각하고 효율성을 높이고 버그를 줄이려면 더 많은 시간을 할애해야합니다. 매우 강력한 논쟁이 될 수 있습니다 . 오라클은 상당히 광범위한 변경 목록을 가지고 있지만 다소 길기 때문에 가능한 한 많이 요약하겠습니다.

언어 기능은 다음과 같습니다.

  • Generics의 상용구가 적습니다. 코드 Map<String, String> myMap = new HashMap<String, String>();를로 줄일 수 있습니다 Map<String, String> myMap = new HashMap<>(). 컴파일러는 왼쪽에서 오른쪽에 필요한 제네릭 형식을 유추 할 수 있으므로 코드를 조금 더 짧고 빠르게 읽을 수 있습니다.
  • 문자열은 이제 switch 문에서 작동합니다.equals()메서드 대신 의미를 사용하여== .
  • try-with-resources를 사용한 자동 자원 관리.이렇게하면 코드가 더 깨끗해 지지만 이전 스타일의 시험 / 최종 코드에 비해 이점이 있습니다. try 문에 예외가 발생하고 닫는 동안 다른 예외가 발생하면 전통적인 try / finally 문을 사용하는 코드는 원래 예외를 완전히 잃고 finally 블록에서 발생한 예외 만 전달합니다. try-with-resources 문에서 런타임은 close () 호출이 던진 예외를 억제하고 원래 예외가 첫 번째의 모든 문제를 발생시킨 것으로 가정하여 원래 예외를 스택 위로 버블 링합니다. 장소. 또한 가비지 수집기에 다른 예외를 포기하는 대신이 억제를 사용하면을 사용하여 근접 예외를 검색 할 수 있습니다 Throwable.getSuppressed.
  • 숫자 리터럴을보다 쉽게 ​​읽을 수 있습니다. 모든 숫자 리터럴은 밑줄을 허용 하므로 int n = 1000000000훨씬 더 읽기 쉽게 만들 수 있습니다. int n = 1_000_000_00010 억 개로 구문 분석하기가 훨씬 쉬우 며, 몰래 입력하기가 더 어렵습니다. 또한 이진 리터럴은 다음 형식 으로 허용 됩니다.0b10110101 되므로 비트 필드에서 작동하는 코드를 조금 더 읽기 좋게 만듭니다.
  • 동일한 catch 문에서 여러 예외 유형을 처리하면 코드 중복을 줄이고 나중에 리팩토링하기가 더 쉬워집니다.

이러한 모든 변경 사항은 관리자가 직접 신경 쓰지 않아도되는 부분이지만 많은 노력과 생각없이 올바른 코드를 작성하는 것이 조금 더 쉬워 지므로 시도하려는 실제 논리에 조금 더 집중할 수 있습니다. 또한 나중에 코드를 좀 더 읽기 쉽도록하여 디버깅 속도를 조금 더 빠르게합니다.

API 측면에서도 여러 가지 API 업데이트가 발생했습니다.

  • 보안 측면에서 , 암호화가 앞으로 나아갈 때 몇 가지 암호화 방법이 추가 / 더 이상 사용되지 않습니다.
  • 파일 IO 가 변경되었습니다 ( 그러나 더 나은 링크 일 수 있습니다. ) 여러 곳에서 더 나은 추상화가 추가되었습니다. 나는 개인적으로 새로운 IO에 익숙하지는 않았지만 매우 유용한 점검처럼 보였으므로 파일 시스템으로 작업하는 것이 훨씬 쉬워졌습니다.
  • 유니 코드 지원 은 기타 여러 국제화 향상 기능과 함께 최대 유니 코드 6.0입니다.
  • 귀하의 질문에 언급 한 Java2D 가 향상되었습니다. 더 나은 Linux 글꼴 지원, 최신 컴퓨터에서 더 나은 X11 렌더링 및 티베트어 스크립트 처리

1
Nit pick : 실제로 문자열 스위치는 "String.equals 연결된 문서에서 방법 을 사용하는 것처럼" 작동합니다 . 실제로 컴파일러는 String.equals순 효과가 동일하다면 사용되지 않도록 최적화 할 수 있습니다. (그리고 String.hashcode특정 수의 스위치 케이스 이상 을 사용할 것으로 예상 됩니다.)
Stephen C

충분합니다. 대부분의 컴파일러는 할 수 있습니다 t 는 그런 작은 일들을 지적하는 것이 중복 그래서,하지만 의미를 변경하지 않는 최적화를; 나는 .equals () 만 명시 적으로 언급했는데 대소 문자는 무시되지 않습니다. 그럼에도 불구하고, 나는 문구를 약간 업데이트했습니다.
Billy Mailman

언 바운드 도메인을 전환 할 때는 문자열 스위치를 사용하지 않는 것이 좋습니다. 열거 형을 켜는 것은 대표적 의미를 가진 String과 같은 표현을 할 수 있기 때문에 전형적인 중간 지점입니다. 전체 답변 BTW에 대한 오 및 +1.
Martijn Verburg

정수 상수 대신 switch 문에서 문자열을 사용하면 어떤 이점이 있습니까?
Giorgio

3
그 중 유일한 비즈니스 이유는 보안 향상 일 수 있습니다. 기술적 인 장점은 비즈니스맨에게는 논쟁의 여지가 있으며 전혀 관련이 없습니다.
jwenting

8

try-with-resources 는 자체적으로 Java 7로 업그레이드 할 가치가있는 기능입니다. 리소스 누수 / 메모리 누수는 Java 개발에서 큰 위험이며 TWR은이 위험을 크게 줄입니다.

애플리케이션에 파일 / 네트워킹 I / O 기능이있는 경우 새로운 NIO.2 파일 추상화 및 비동기 기능도 추가 할 것입니다 .


그들은 또한 필요한 PermGen의 양을 줄이고 대신 Heap 또는 네이티브 메모리를 사용하고 있습니다. 지금 그것이 어디에 저장 될지 잘 모르겠습니다. 이것은 Java 8에서 두 개의 최대 메모리 매개 변수를 설정할 필요가 없음을 의미합니다.
Andrew T Finnell

리소스를 사용한 시도는 최종 시도와 동일하지만 보일러 플레이트가 적은가?
jhewlett

1
보일러 플레이트가 적을수록 더 쉽게 얻을 수 있다고 생각합니다.
MatrixFrog

1
보일러 플레이트가 적고 닫는 의미가 있습니다. 그들은 OpenJDK 내부 에서 시간의 2/3 정도에 대해 수동으로 잘못하고 있음을 발견했습니다 . 다른 코드에서 다른 비율이 의심됩니다.
Martijn Verburg

6

Java 7로 전환 하지 말아야 할 이유가있을 수 있습니다. Oracle의 VM을 사용해야하고 소프트웨어가 내장 하드웨어에서 실행되거나 내장 하드웨어와 함께 배포하는 경우 : Oracle은 JRE의 라이센스를 변경하여 위의 라이센스가 없는 경우 조건이 충족되었습니다. Java SE 임베디드 라이센스 를 구매 해야합니다 . Java SE Embedded에 대한 "일반 목적 시스템"의 의미는 무엇입니까?를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.