2013-07-25 24 views
11

Tôi đang viết mã bằng scala và sử dụng SBT với plugin sbt-assembly. Dự án của tôi có rất nhiều thư viện bên ngoài, và do đó sbt-assembly mất một thời gian dài để đóng gói tệp JAR. Tôi muốn có một tệp jar riêng cho mã của tôi và cho các phụ thuộc. Vì vậy, tôi chỉ có thể biên dịch lại và chỉ repack mã của tôi. làm như thế nào?sbt-assembly: cách liên kết bình phụ thuộc với bình chính?

Progress cho đến nay:

Các lệnh sau đây trong build.sbt ngăn SBT-lắp ráp từ đóng gói các thư viện:

assembleArtifact in packageScala := false

assembleArtifact in packageDependency := false

Sau đó lọ riêng biệt có thể được xây dựng bởi chuyển các lệnh sau: assembly, assembly-package-scalaassembly-package-dependency. Họ làm cho ba lọ: một trong những có chứa chương trình của tôi, một với các thư viện scala và một với tất cả các phụ thuộc.

Tuy nhiên, tệp jar không thể thực thi được nữa vì nó không thấy các phụ thuộc trong tệp jar riêng biệt. Tôi nghĩ rằng tôi cần phải thêm một classpath để lắp ráp-sbt, nhưng tôi không chắc chắn làm thế nào để làm điều này. Xin vui lòng giúp đỡ (ý kiến ​​chi tiết được đánh giá cao, như tôi mới để SBT). Cảm ơn!

Trả lời

5

Xem Setting Classpath Still Can't Find External Jar. Oracle nói:

Khi bạn sử dụng tùy chọn này, tệp JAR là nguồn của tất cả các lớp người dùng và cài đặt đường dẫn lớp người dùng khác bị bỏ qua.

Vì vậy, bạn có thể nói:

java -cp "foo-assembly-0.1-deps.jar:foo-assembly-0.1.jar" Main 

nơi Main là tên của các lớp học chính, và : là tách tập tin trên hệ điều hành của bạn (; trên Windows).

Hiện tại có vẻ như đã xảy ra lỗi trong assembly-package-scala và lỗi này không có vấn đề gì bởi vì assembly-package-dependency cũng chứa thư viện Scala.

+0

Nó hoạt động! và nó nhanh: thời gian giảm từ khoảng 40 giây xuống còn vài giây. Ghi chú kỹ thuật: Tôi cũng cần thêm 'scala-library-2.10.2-assembly.jar' vì nếu không thì scala repl là không ổn định. Tôi có thể biên dịch nó với sbt 0.12.4 và sbt-assembly 0.9.0. – Karolis

+0

Có cách nào để đóng gói tham chiếu lớp này vào tệp jar chính không? Vì vậy, nó sẽ có thể thực hiện jar bằng cách nhấp vào nó. – Karolis

+0

[sbt-onejar] (https://github.com/sbt/sbt-onejar) có thể tạo ra một lọ chứa các lọ khác và nó đóng gói nhanh hơn. Nhưng tôi nghe sbt-lắp ráp bắt đầu lên nhanh hơn bởi vì có lẽ sbt-onejar'ed jar cần phải giải nén trên bay. sbt-assembly 0.9.0 lưu trữ thư mục lib unzips, do đó bạn không cần phải chia chúng ra. –

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