복붙노트

[SCALA] 임베디드 스칼라 REPL 상속 부모 클래스 경로

SCALA

임베디드 스칼라 REPL 상속 부모 클래스 경로

스칼라 메일 링리스트에이 스레드에 질문으로, 어떻게 내장 스칼라 REPL을 만들 수 있습니다 상속 부모 프로그램의 클래스 경로? 스칼라 프로그램을 사용하여 시작됩니다 부모 가정 스칼라 -cp <클래스 패스> ...; <클래스 패스> 문자열로 액세스와 내장 REPL을 초기화 할 수 있을까? (은 System.getProperty ( "java.class.path를"을 통해 자바 클래스 경로, 가능), 스칼라 클래스 경로에서 차이가 나타납니다.)

또한, 아마도 내장 스칼라 REPL은 상속 또는 부모 프로세스로부터 클래스 로더를 구성 할 수 있습니다 (마이클 Dürig의 ScalaDays 2010 이야기와 관련이 있음). 이것은 권장되는 방법인가?

해결법

  1. ==============================

    1.나는 같은 일을 할 노력하고있어, 난 그냥 인터넷 검색하여 길 내 밖으로 발견 :

    나는 같은 일을 할 노력하고있어, 난 그냥 인터넷 검색하여 길 내 밖으로 발견 :

    lazy val urls = java.lang.Thread.currentThread.getContextClassLoader match {
      case cl: java.net.URLClassLoader => cl.getURLs.toList
      case _ => error("classloader is not a URLClassLoader")
    }
    lazy val classpath = urls map {_.toString}
    

    위의 코드는 당신에게 현재 컨텍스트에서 클래스 경로를 가져옵니다.

    settings.classpath.value = classpath.distinct.mkString(java.io.File.pathSeparator)
    

    당신의 settings.classpath에 그것을 넣어 당신은 파견 또는 어떤 라이브러리가 필요을 발사 할 수 있어야한다.

  2. ==============================

    2.true로 usejavacp 속성을 설정합니다 :

    true로 usejavacp 속성을 설정합니다 :

    val settings = new scala.tools.nsc.Settings
    settings.usejavacp.value = true
    
  3. ==============================

    3.실행중인 스칼라 프로그램 내에서 "스칼라 클래스 경로"에 접근 할 수있는 쉬운 방법이있을 것 같지 않습니다 (대조적으로 "자바 클래스 패스"는 java.class.path를 시스템 속성을 통해 가능). 하나는, 예를 들어, 액세스 scala.tools.PathResolver의 인스턴스의 필드 Calculated.userClasspath을 싶지만, 후자는 접근하지 않는 것 같습니다. 아마도 가장 쉬운 해결 방법은 환경 변수에 -classpath 매개 변수 문자열을 저장하는 스칼라 시작 스크립트를 수정하는 것입니다.

    실행중인 스칼라 프로그램 내에서 "스칼라 클래스 경로"에 접근 할 수있는 쉬운 방법이있을 것 같지 않습니다 (대조적으로 "자바 클래스 패스"는 java.class.path를 시스템 속성을 통해 가능). 하나는, 예를 들어, 액세스 scala.tools.PathResolver의 인스턴스의 필드 Calculated.userClasspath을 싶지만, 후자는 접근하지 않는 것 같습니다. 아마도 가장 쉬운 해결 방법은 환경 변수에 -classpath 매개 변수 문자열을 저장하는 스칼라 시작 스크립트를 수정하는 것입니다.

    원하는 스칼라 클래스 경로가 결정될 수있다 가정하면,이를 통해 임베디드 스칼라 인터프리터에 전달 될 수있다 : settings.classpath.value = ...

    업데이트 : 스칼라 클래스 경로 문자열이 스칼라 런타임에서 직접 달성되지 않을 수 있지만, @Eugene는이 컨텍스트 클래스 로더에서 추출 할 수 있음을 지적한다. 감사.

  4. from https://stackoverflow.com/questions/4121567/embedded-scala-repl-inherits-parent-classpath by cc-by-sa and MIT license