2010-11-08 36 views
8

Như được yêu cầu trong this thread trên danh sách gửi thư Scala, làm thế nào tôi có thể tạo một Scala REPL nhúng kế thừa classpath của chương trình cha mẹ? Giả sử chương trình Scala mẹ được khởi chạy sử dụng scala -cp <classpath> ...; có thể truy cập <classpath> dưới dạng chuỗi và được sử dụng để khởi tạo REPL được nhúng không? (Các Java classpath, có sẵn thông qua System.getProperty("java.class.path"), dường như khác với classpath Scala.)Embedded Scala REPL thừa kế classpath cha mẹ

Ngoài ra, có lẽ là (ScalaDays nhúng Scala REPL có thể kế thừa hoặc xây dựng ClassLoader từ quá trình cha mẹ Michael Dürig 2010 talk thể có liên quan). Đây có phải là phương pháp được đề xuất không?

+0

Tôi chưa từng nghe nói đến một thông dịch viên Scala. Tôi có thể lấy nó ở đâu? – ziggystar

+0

Bằng thông dịch viên, tôi có nghĩa là Scala REPL. Nó đi kèm với trình biên dịch Scala. Đó là những gì bạn nhận được khi bạn thực thi 'scala' thực thi từ dòng lệnh. Câu hỏi này là về việc nhúng một REPL trong một chương trình Scala đang chạy. –

+0

Tôi đã chỉnh sửa câu trả lời của bạn để phản ánh ý bạn là REPL. – ziggystar

Trả lời

6

Tôi đang cố gắng để làm điều tương tự, và tôi chỉ tìm thấy một con đường của tôi hiện bởi Googling:

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} 

Đoạn mã trên được bạn classpath trong bối cảnh hiện nay.

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

Đặt mã đó vào số settings.classpath và bạn có thể kích hoạt công văn hoặc bất kỳ thư viện nào bạn cần.

+0

Cảm ơn, điều này rất hữu ích.Cách khắc phục mà tôi đã giải quyết là sử dụng biến môi trường classpath Java (tức là '$ CLASSPATH') thay vì classpath Scala. Đường dẫn lớp Java được kế thừa bởi trình thông dịch được nhúng, sau đó tùy chọn "usejavacp" hoạt động. –

2

thiết lập usejavacp tài sản cho đúng:

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

Kỹ thuật này dường như không thêm đường dẫn lớp _Scala_ vào trình thông dịch mới được tạo. Như được ghi trong 'scala.tools.nsc.StandardScalaSettings.scala', tùy chọn này chỉ bao gồm' java.class.path' trong độ phân giải classpath. –

+0

Hãy xem https://lampsvn.epfl.ch/trac/scala/wiki/Classpath và mã nguồn có liên quan tại http://lampsvn.epfl.ch/svn-repos/scala/scala-msil/trunk/ src/compiler/scala/tools/util/PathResolver.scala Những mô tả việc xử lý đường dẫn lớp hiện tại trong một số chi tiết. – michid

+0

Tôi không biết cách sử dụng thông tin này. Có cách nào để truy cập vào cá thể của scala.tools.util.PathResolver trong chương trình hiện đang thực thi không? Nếu có, tôi có thể tái sử dụng đối tượng Cài đặt của nó cho trình thông dịch được nhúng mà tôi đang tạo. –

1

Hiện không có vẻ là một cách dễ dàng để truy cập vào "Scala classpath" từ bên trong một chương trình Scala chạy (ngược lại, "Java classpath" là có sẵn thông qua thuộc tính hệ thống java.class.path). Một người muốn truy cập, ví dụ: trường Calculated.userClasspath trong trường hợp của scala.tools.PathResolver, nhưng trường sau dường như không thể truy cập được. Có lẽ cách làm việc đơn giản nhất là sửa đổi kịch bản lệnh khởi chạy scala để lưu trữ chuỗi tham số -classpath trong một biến môi trường.

Giả sử Scala classpath mong muốn có thể được xác định, nó có thể được truyền cho Scala dịch nhúng qua: settings.classpath.value = ...

Cập nhật: mặc dù chuỗi classpath Scala có thể không đạt được trực tiếp từ runtime Scala, @ Eugene chỉ ra rằng nó có thể được trích xuất từ ​​trình nạp lớp ngữ cảnh. Cảm ơn.

Các vấn đề liên quan