2012-05-07 3 views
3

이것은 여러 번 묻고 대답 한 질문 일 수 있습니다.하지만 대답을 찾을 수 없습니다.컴파일 된 Java 프로젝트의 클래스 파일을 대체 할 수 있습니까?

서버에서 컴파일 된 응용 프로그램을 실행중인 경우 내 로컬 컴퓨터에서 응용 프로그램을 컴파일하고 로컬 컴퓨터에서 컴파일 한 클래스를 서버의 것과 교환 할 수 있습니까?

다른 말로하면 컴파일하고 서버 측에있는 파일을 거의 동일하게 바꿀 수 있습니까? 내 로컬 컴퓨터에서 컴파일되고 위치합니까?

서버 측의 버전은 다른 파일에 하드 코딩 된 연결이 있기 때문에 모든 장소를 알지 못하므로 필요한 파일 중 하나만 바꿔야합니다. 응용 프로그램 전체.

답변

3

질문에 대한 답은 예입니다. 클래스 파일을 대체 할 수는 있지만 다른 종속성이 변경되지 않았다는 점에서 다소 복잡합니다.

예를 들어 컴파일하는 클래스가 다른 클래스에서 사용되는 메서드의 메서드 서명을 변경하는 경우 이러한 클래스를 바꿔야합니다. public, protected 또는 default 메서드의 메서드 시그니처가 변경되지 않는 한 괜찮습니다.

자주 묻는 질문입니다. 자주하는 일인 경우 개별 매개 변수 대신 개체가 종종 메서드로 전달되는 이유를 빨리 알 수 있습니다.

public MyObject getObject(MyObject2 mySecondObject) 

public MyObject getObject(int a, int b, int c) 

당신이 메서드에 전달 객체, 메소드 서명이 변경되지 않습니다,하지만 당신은 추가하거나 방법에 매개 변수를 제거 할 때에 새로운 속성을 추가 할 필요가

서명 자체는 모든 종속성에 대한 연쇄 반응을 생성하므로 해당 클래스 파일도 컴파일하고 교체해야합니다.

마지막으로 강조 할 점은 개인 메서드 나 개인 변수 또는 메서드 정의에 대한 변경 사항이 다른 클래스 파일에 영향을 미치지 않는다는 점입니다. 중요한 것은 입력 및 출력이 항상 동일한 데이터 형식을 사용하고 반환한다는 점에서 메서드가 다른 클래스와 갖는 계약을 유지한다는 것입니다.

이것은 인스턴스 변수의 캡슐화의 중요성과 이러한 종속성을 다른 클래스에서 숨기는 방법을 강조합니다.

+1

메소드 서명을 지적하기위한 +1 – Matsemann

+0

JDK 버전은 어떻습니까? 나는 새 클래스 파일을 교체해야 할 JDK와 동일한 JDK를 사용하여 컴파일해야한다고 생각한다. – Cam

+0

안녕하세요 @ 캠, 당신이 옳다고 거의 확신합니다. 솔직히 기억이 안 나는 자바 클래스 파일을 디 컴파일 한 지 오래되었습니다. ;) – jmort253

2

네, 할 수 있습니다. 또한 핫 스폿으로 인해 클래스가 런타임에 다시로드되기 때문에 서버를 다시 시작할 필요가 없습니다. 이는 개발주기 동안 매우 유용합니다.

하지만 하나의 별도 클래스를 바꾸는 것에주의하십시오. 클래스가 환경에서 변경된 다른 클래스에 대한 참조를 가지고 있으면 서버에서 대체가 실패합니다.

+0

핫스왑에서 변경되지 않은 클래스 (클래스가 serialVersionID로 계산 됨)를 감지 할 수 있으므로 로컬 클래스를 잊어 버리는 것과 같은 배포 위험이 발생할 수 있습니다. 전쟁을 전개하는 데 더 오래 걸릴 수도 있지만 자동으로 만들 수 있습니다. –

1

'오프라인'대체 (서버를 다시 시작할 수 있음)에 대해 이야기하고 있다고 가정합니다.

이 경우 다음 해결책을 사용할 수 있습니다. Java는 클래스 경로 변수를 사용합니다. 여기서 프로세스가 파일을 찾을 일련의 jar/폴더를 정의합니다.

그래서 다음과 같은 작업을 수행 할 수 있습니다

  1. 새 클래스를 만듭니다 (이 같은 이름이어야하며, 같은 패키지에있는) 및 컴파일합니다.
  2. 업데이트 된 클래스를 저장할 폴더를 서버에 만듭니다.

  3. 업데이트 (아마 응용 프로그램의 시작 스크립트로) 클래스 경로 변수이 폴더가 수업의 전에 나머지 나타나도록.

  4. 서버를 다시 시작하십시오. 이제 새 수업은 이전 수업보다 먼저 해결되어로드됩니다.

주의 : 이것은 '독립형'응용 프로그램 및 사용자 정의 클래스 로더와 바이올린을하지 않는 사람들을 위해 일반적으로 작동 (예를 들어,이 응용 프로그램 서버의 경우입니다).

더 복잡한 솔루션은 클래스 로더를 정의하는 것을 기반으로 할 수 있습니다.이 클래스 로더는 그러한 폴더를 살펴보고 거기에서 리소스를로드하려고 시도합니다.

희망이 도움이됩니다.

관련 문제