jar 내부의 파일 수정


87

내 항아리 안의 파일을 수정하고 싶습니다. 내 응용 프로그램에서 추출 및 재 조립없이이 작업을 수행 할 수 있습니까?

수정하려는 파일은 대부분 xml 기반의 구성 파일입니다.

내가 unjarring하지 않는 데 관심이있는 이유는 응용 프로그램을 unjar하면 launch4j로 래핑되어 .exe 파일을 다시 만들 수 없기 때문입니다.


1
파일 시스템에 임시 파일을 만들지 않고 응용 프로그램 내에 보조 파일을 유지하고 싶습니다.
Hamza Yerlikaya

이 솔루션을 사용해보십시오. stackoverflow.com/a/4837522/1853864 사용했는데 문제가 해결되었습니다.
A. Magalhães 2011

현재 허용되는 답변을 수락하지 않으시겠습니까? 그것은 부정적인 점수를 가지고 있으며, 절대적으로 도움이되지 않습니다
DICI

답변:


83

다음 u옵션을 사용할 수 있습니다.jar

Java Tutorials에서 :

jar uf jar-file input-file(s)

"추가되는 파일과 동일한 경로 이름을 가진 아카이브에 이미있는 모든 파일을 덮어 씁니다."

JAR 파일 업데이트를 참조하십시오 .

항아리 전체를 다시 만드는 것보다 훨씬 낫습니다. 프로그램 내에서 이것을 호출하는 것도 가능합니다. Java에서 명령 줄 실행 시도


대박! 그러나 그들은 재미있는 경로 이름을 추가했습니다. IE Bitbucket.foo.bar 대신 com.etc.etc의 기존이있다
StarWind0

26

Vim을 사용할 수 있습니다.

vim my.jar

Vim은 unzip사용자 환경에서 압축 된 텍스트 파일을 편집 할 수 있습니다.


3
이것은 훌륭합니다. 찾고있는 파일로 이동하고 Enter 키를 누릅니다. 파일을 편집 한 다음 : wq를 입력하여 저장하십시오!
Michael Butler

또한 zip변경 사항을 저장할 수있는 환경 이 필요 합니다. 답변 해주셔서 감사합니다!
troig

11

Java jar 파일은 zip 파일과 동일한 형식입니다. 따라서 아카이브를 수정할 수있는 zip 파일 유틸리티가있는 경우 발을 들여 놓을 수 있습니다. 두 번째 문제는 만약 당신이 클래스 나 무언가를 재 컴파일하고 싶다면 아마도 단지 단지 재 빌드해야 할 것입니다. 그러나 텍스트 파일 또는 기타 (예 : xml)는 쉽게 수정할 수 있어야합니다.


8

많은 사람들이 말했듯이 JAR을 다시 만들지 않고는 JAR의 파일을 변경할 수 없습니다. Launch4J를 사용하면 더 나빠집니다. 일단 JAR을 변경하면 EXE를 다시 빌드해야합니다. 그러니이 길을 가지 마십시오.

일반적으로 구성 파일을 JAR에 넣는 것은 좋지 않습니다. 여기 내 제안이 있습니다. 미리 지정된 위치 (예 : 홈 디렉토리, \ Program Files \ 등)에서 구성 파일을 검색합니다. 구성 파일을 찾으면 사용하십시오. 그렇지 않으면 JAR에있는 것을 폴백으로 사용하십시오. 이렇게하면 미리 결정된 위치에 구성 파일을 작성하기 만하면 프로그램이이를 선택합니다.

이 접근 방식의 또 다른 이점은 소프트웨어를 업그레이드해도 수정 된 구성 파일을 덮어 쓰지 않는다는 것입니다.



2

이것은 단기적으로 처리하려는 것보다 더 많은 작업 일 수 있지만 장기적으로는 jar를 수동으로 빌드하는 대신 Ant (또는 Maven 또는 Bazel ) 를 사용하는 것이 매우 유익 할 것이라고 생각합니다. . 이렇게하면 ant 파일 (Eclipse를 사용하는 경우)을 클릭하고 jar를 다시 빌드 할 수 있습니다.

또는 실제로 jar에 이러한 구성 파일이 전혀 포함되어 있지 않을 수 있습니다. 이러한 파일을 정기적으로 교체해야하거나 여러 당사자에게 배포해야하는 경우 구성 파일은 다음의 일부가 아니어야합니다. 항아리.


2
동의합니다. 그러나 "기본"구성 파일을 JAR에 넣을 수 있으므로 외부 파일에 문제가 발생하면 (손상, 삭제 등) 기본 구성으로 돌아갈 수 있습니다.
Thomas Owens

사실-구성 파일없이 계속 작동 할 수있는 응용 프로그램 수는
모르겠지만

1

dfa가 말한 내용을 확장하려면 jar 파일이 zip 파일처럼 설정되어 있기 때문입니다. 파일을 수정하려면 모든 항목을 읽고 변경할 항목을 수정 한 다음 항목을 jar 파일에 다시 써야합니다. 나는 전에 이것을해야했고, 그것이 내가 그것을 할 수있는 유일한 방법이었다.

편집하다

이것은 파일 스트림 인 내부에서 Java jar 파일 편집기를 사용하고 있습니다. 나는 그것을 할 수있는 방법이 있다고 확신합니다. 전체 병을 메모리로 읽고 모든 것을 수정 한 다음 파일 스트림에 다시 쓸 수 있습니다. zip 헤더의 ToC가 쓰기 시간에 정의되어야한다고 믿기 때문에 이것이 내가 7-Zip과 같은 유틸리티가하고 있다고 믿는다. 그러나 나는 틀릴 수 있습니다.


1

예, SQLite를 사용하면 jar 파일 내에서 데이터베이스를 읽거나 쓸 수 있으므로 추출한 다음 다시 jar로 만들 필요가 없습니다. 내 게시물 http://shoaibinamdar.in/blog/? p = 313

"jdbc : sqlite :: resource :"구문을 사용하면 jar 파일 내에서 데이터베이스를 읽고 쓸 수 있습니다.


1
안녕하세요, stackoverflow에 오신 것을 환영합니다. 게시물에서 약어를 제거했습니다. 일반적으로 문자 메시지 스타일의 속기는 여기에 적합하지 않습니다. 이 답변은 답변 자체에 블로그의 세부 정보를 더 포함하면 질문에 대한 좋은 답변이 될 것입니다. 그래야 답변을 읽는 사람이 블로그를 읽지 않거나 이동해도 무언가를 배울 수 있습니다. 미래에 다른 URL로.
Flexo

1

TrueZip을 확인하십시오 .

가상 파일 시스템 API를 통해 원하는대로 정확히 수행합니다 (jar 파일 내에서 파일을 인라인으로 편집). 또한 중첩 된 아카이브 (jar 내부의 jar)도 지원합니다.


1

예를 들어 jar 파일을 추출하십시오. winrar 및 CAVAJ 사용 :

Cavaj Java Decompiler는 CLASS 파일에서 Java 소스 코드를 재구성하는 그래픽 프리웨어 유틸리티입니다.

필요한 경우 비디오 자습서가 있습니다 : https://www.youtube.com/watch?v=ByLUeem7680


여기에서 "CAVAJ 사용"소프트웨어가 답입니다. 추가 설명이 필요한 경우 링크는 단지 추가입니다.
Tomasz Mularczyk


0

Windows에서이 작업을 수행하는 가장 간단한 방법은 WinRAR을 사용하는 것입니다 .

  1. 파일을 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 "WinRAR로 열기"를 선택합니다.
  2. 편집 할 파일을 탐색하고 두 번 클릭하여 기본 편집기에서 엽니 다.
  3. 변경 한 후 저장하고 편집기를 종료합니다.
  4. 그러면 아카이브의 파일을 업데이트 할 것인지 묻는 대화 상자가 나타납니다. "예"를 선택하면 JAR이 업데이트됩니다.

0

위의 대부분의 답변은 클래스 파일에 대해 할 수 없다고 말합니다.

클래스 파일업데이트 하려는 경우에도 그렇게 할 수 있습니다. 당신이해야 할 일은 단지 당신의 작업 공간에서 클래스 파일을 드래그 앤 드롭하는 것입니다.

class file의 변경 사항을 확인하려면 jd-gui와 같은 디 컴파일러를 사용하여 수행 할 수 있습니다.

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