2017-02-02 1 views
1

uberjar에 포함될 때 작동하지 않는 Java 라이브러리에 의존하는 clojure 프로젝트가 있습니다. (다른 JAR 파일에서 같은 파일 이름을 사용하는 다른 XML 설명자를 필요로합니다.) leiningen과 함께 Docker를 사용하여 찾은 모든 것은 uberjar 빌드 및 패키징에 따라 다릅니다. 그것은 또한 모든 클로저 드커 이미지를 지금까지 구축 한 방법입니다.leiningen을 사용하여 비 uberjar Docker 이미지 작성

io.fabric8/docker-maven-plugin과 같은 여러 jar 파일을 사용하여 Docker 이미지를 패키징하는 leiningen 플러그인이 있습니까?

+0

uberjar는 언어와 관련이 없습니다. 따라서 모든 빌드 도구를 사용하여 Clojure 코드로 빌드 할 수 있습니다. 일반적으로 필자는 SBT를 선호하지만 uberjars를 만들기 위해 필자는 SBT 플러그인으로 lein 플러그인보다 더 많은 성공을 거두었습니다. 예를 들어 귀하의 경우 https://github.com/marcuslonnberg/sbt-docker가 도움이 될 수 있습니다. –

+0

@ChrisMurphy 귀하의 제안에 감사드립니다. 내 문제는 내가 사용하고있는 라이브러리가 uber-jar에 리 패키징 될 때 작동하지 않는다는 것입니다. 내 컨테이너를 원래 jar 파일로 패키지화 한 다음 애플리케이션을 시작할 때 classpath에서이 jar를 참조해야합니다 .-이 작업을 수동으로 수행하면 작동합니다. 이 플러그인은 항아리를 다시 포장하지 않으므로 docker-maven-plugin으로 패키지 할 때도 작동합니다. maven의 문제는 이맥스/사이다가 maven을 지원하지 않는다는 것입니다. –

답변

0

패키징 (uberjar, war) 할 때마다 생성 된 큰 파일에는 .class 파일과 디렉토리 구조가 포함됩니다. 이 XML 파일은 어디에서 (클래스)로드되어야합니까? 수동으로 포장하여 실험해볼 수 있습니다. 결국 (uberjar, war 또는 jar) zip 파일 일뿐입니다.

레이아웃을 정확히 알고있을 때 SBT는 많은 입력 jar 파일에서 패키지 할 수 있도록 충분히 유연합니다. 불행히도 lein 플러그인은 항상 중복을 덮어 쓰는 것과 같은 일을 할 것이고 패키징 동작을 제어 할 수는 없습니다. 나는 유연성을 정확하게 기억할 수는 없지만 패키징 프로세스가 어떻게 진행되었는지, 어떤 결정이 내려 졌는지는 제어 할 수 없었습니다.

필자는 수동으로하기 때문에 Windows에서 사용했던 것보다 훨씬 뛰어난 아카이브 관리자라는 Linux를 사용합니다. 수동으로 수행하는 것만으로도 충분할 수 있습니다. SBT의 단점은 물론 스칼라를 포함 해 배워야한다는 것입니다.

다른 JAR 파일에서 동일한 파일 이름을 사용하는 XML 설명자가 필요합니다.

그냥 이것에 대해 생각해 보면 다른 항아리에있는 각 파일의 내용을 uberjar에있는 하나의 파일에 추가해야합니까? 너는 그것을 밖으로 시도 할 수있다. 작동하고 zip 파일을 수동으로 생성하고 이름을 바꾸면 고통 스러울 정도로 자주 패키지해야하는 경우 SBT가 최선의 방법이라고 믿습니다.

나는 원래 JAR 파일 내 컨테이너를 포장, 항아리보다

클래스 로더 클래스를로드하지 않고 응용 프로그램을 시작할 때 다음 클래스 경로에이 항아리를 참조해야합니다. .class 파일, (uber) 항아리, 전쟁과 같이 모든 것을 제공하는 것은 컨테이너의 작업입니다. classpath에서 동적으로로드되는 프로그램은 클래스 나 리소스 (.xml 파일과 같은 것)를로드합니다. .jar 파일이 리소스 일 수 있다고 가정합니다.이 경우 uberjar에 jar 파일을 넣습니다. 따라서 패키지화는 여전히 가능합니다.

관련 문제