JDK 11을 사용하여 NixOS에서 Play Framework 실행

좋은 아침! 먼저, 몇 가지 개인적인 소식입니다. 저는 NixOS로 전환하고 있으며 이에 대해 다소 기대하고 있습니다. 이에 대한 기사가 있을 것으로 기대합니다. 오늘 저는 sbt 설치 및 JDK 11로 다운그레이드를 포함하여 Play Framework 환경을 손쉽게 설치하고 실행할 수 있게 된 것을 축하합니다.

소프트웨어 개발자로서 나는 내 환경과 싸워야 하는 것을 좋아하지 않기 때문에 NixOS가 패키지를 유지 관리하기 위해 순전히 기능적이고 선언적인 접근 방식을 사용한다는 소식을 들었을 때 관심이 있었습니다. 최근에 깨끗한 데스크탑을 유지하는 제 접근 방식에는 revolved around docker이 있으므로 확실히 해킹이 덜한 접근 방식에 개방적입니다.

실제 테스트는 sbt인데, 제 경험상 까다로운 소프트웨어입니다. Java 종속성이 있는 모든 항목은 이미 복잡해질 수 있으며 sbt는 종속성을 즉시 다운로드하므로 특히 상태 저장형입니다. 지금까지 나는 위의 Docker-and-alias 트릭을 작동시키는 데 성공하지 못했습니다.

NixOS에 sbt 설치



...유쾌하게 사소합니다./etc/nixos/configuration.nix 파일의 패키지 목록에 일반적인 NixOS 방식으로 설치할 수 있는 sbt package in the official repository이 있습니다.

/etc/nixos/configuration.nix

...
  environment.systemPackages = with pkgs; [
    docker
    emacs
    firefox
    git
    gnome.gnome-tweaks
    sbt
    wget
  ];

  ...


그런 다음 변경 사항을 적용하려면 sudo nixos-rebuild switch 를 실행하십시오.

그런 다음 기존 프로젝트에 대해 sbt를 실행할 수 있으며 원활하게 작동합니다.

그러나 런타임 시 재생과 호환되지 않습니다.

UncheckedExecutionException: java.lang.IllegalStateException: 캐시 항목을 로드할 수 없습니다.



응용 프로그램을 실행하면 예외가 발생합니다.

콘솔 출력

--- (Running the application, auto-reloading is enabled) ---

p.c.s.AkkaHttpServer - Listening for HTTP on /[0:0:0:0:0:0:0:0]:9000

(Server started, use Enter to stop and go back to the console...)

2022-07-04 12:46:00 ERROR p.api.http.DefaultHttpErrorHandler

! @7o7k89hhe - Internal server error, for (GET) [/] ->

play.api.UnexpectedException: Unexpected exception[UncheckedExecutionException: java.lang.IllegalStateException: Unable to load cache item]
    at play.core.server.DevServerStart$$anon$1.reload(DevServerStart.scala:254)
    at play.core.server.DevServerStart$$anon$1.get(DevServerStart.scala:148)
    at play.core.server.AkkaHttpServer.handleRequest(AkkaHttpServer.scala:302)
    at play.core.server.AkkaHttpServer.$anonfun$createServerBinding$1(AkkaHttpServer.scala:224)
    at akka.stream.impl.fusing.MapAsync$$anon$30.onPush(Ops.scala:1307)
    at akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:542)

...



오류 페이지의 스택 추적

com.google.common.util.concurrent.UncheckedExecutionException: java.lang.IllegalStateException: Unable to load cache item
     com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2051)
     com.google.common.cache.LocalCache.get(LocalCache.java:3962)
     com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3985)
     com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4946)
     com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4952)
     com.google.inject.internal.FailableCache.get(FailableCache.java:54)
     com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:49)
     com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:155)
     com.google.inject.internal.InjectorImpl.initializeBinding(InjectorImpl.java:592)



주어진 두 스택 추적은 다양한 Play, Akka, Google 및 심지어 핵심 Java 라이브러리를 통해 실제 애플리케이션 코드에서 훨씬 다운스택된 오랜 세월 동안 계속됩니다.

플레이 프레임워크 호환성



빠른 검색을 통해 다른 사람들이 호환되지 않는 Java 버전에 대해 Play Framework를 실행할 때 이 문제가 발생하고 Play Framework 2.8(이 글을 작성할 당시의 현재 버전)이 JDK 8 및 JDK 11과 호환된다는 것을 알 수 있습니다. sbt 시작하면서 JDK 17을 사용하는 것을 보고 JDK 11로 다운그레이드해야 한다는 것을 알았습니다.

동일한/etc/configuration.nix를 사용하여 JDK 11 패키지를 설치하려고 시도했지만 물론 Nix의 기능이므로 작동 방식이 아닙니다. 각 패키지에는 자체 종속성이 있으며 sbt는 여전히 JDK 17을 사용합니다.

따라서 질문은 sbt가 사용하는 JDK 버전을 JDK 11에서 JDK로 어떻게 다운그레이드합니까?

그리고 이것은 나를 약간 가렵게 만듭니다. 이게 힘들까요? sbt 패키지를 포크해야 합니까? 처음에 NixOS로 전환한 이유는 그런 일을 피하기 위해서입니다.

sbt에서 사용하는 JDK 버전 다운그레이드



It turns out it's easy. sbt 패키지에서 사용하는 Java 버전은 구성 파일의 동일한 줄 내에서 선언적으로 무시할 수 있습니다.

/etc/nixos/configuration.nix

  ...

  environment.systemPackages = with pkgs; [
    docker
    emacs
    firefox
    git
    gnome.gnome-tweaks
    (sbt.override { jre = pkgs.jdk11; })
    wget
  ];

  ...


그런 다음 nixos-rebuild switch 시작하면 됩니다!

결론적으로... 난 이게 좋은 것 같아!



한편으로 저는 거의 10년 동안 우분투 사용자였습니다. 나는 그곳에서 생산적인 방법을 알고 있습니다. 문제가 발생하면 일반적으로 고칠 수 있고, 고칠 수 없는 경우 일반적으로 시작하기에 좋은 검색어가 무엇인지 파악할 수 있습니다. 반면에 nix가 실제로 얼마나 강력한지 살짝 엿본 것 같습니다. 한 줄로 완벽하게 재현 가능한 Scala 환경을 만들 수 있다면 그것만으로도 가치가 있을 것입니다. 더 많은 것이 올 것이라고 확신합니다.

좋은 웹페이지 즐겨찾기