2014-08-28 13 views
5

Tôi đang sử dụng plugin sbt-native-packager để tạo tập lệnh bắt đầu cho ứng dụng của mình, rất thuận tiện vì plugin này tạo ra đặc tả classpath chính xác với tất cả các phụ thuộc thư viện của tôi. Tôi không phân phối ứng dụng này, do đó tôi không đóng gói toàn bộ thứ đó thành một tarball. Tôi chỉ sử dụng thư mục lib được tạo bởi sbt-native-packager chứa tất cả các tệp jar mà dự án của tôi phụ thuộc, cả thư viện của bên thứ ba cũng như tệp jar chứa tệp lớp và tài nguyên của riêng tôi.Làm thế nào để làm cho sbt-native-packager không đặt tài nguyên của tôi vào tệp jar?

Trong thư mục src/main/resources của dự án của tôi Tôi có các tệp mà tôi muốn chỉnh sửa mà không phải sử dụng sbt-native-packager để tạo lại toàn bộ cài đặt, ví dụ: tệp cấu hình. Điều này là khó khăn bởi vì những tập tin được nén lên trong tập tin jar với tất cả các lớp học của tôi.

Câu hỏi: làm thế nào tôi có thể nói sbt-native-packager không đặt tệp tài nguyên của tôi vào tệp jar, trong khi vẫn tạo tập lệnh khởi đầu với đường dẫn chính xác cho các tệp tài nguyên đó được định vị và đọc bởi ứng dụng của tôi như chúng bây giờ từ trong tệp jar? Nếu điều này có nghĩa là để lại tất cả các tệp lớp của tôi ra khỏi tệp jar, miễn là các tệp từ src/main/resources vẫn là tệp mà tôi có thể thay đổi mà không cần gọi lại sbt stage và miễn là tập lệnh bắt đầu hoạt động.

+0

Tôi tin rằng bạn đang cố gắng để đạt được là hành vi mặc định của SBT-start-script https://github.com/sbt/sbt-start-script#about-this-plugin-sbt-start-script –

+2

@ Jhonny Everson Đó có thể là, nhưng đó là 'README' cho dự án đó đã dẫn tôi đến sbt-native-packager. Điều đầu tiên nó nói (dưới một tiêu đề rất lớn) là nó có thể được thay thế bằng sbt-native-packager, điều này khiến cho âm thanh như thể là một ý tưởng tồi khi chấp nhận nó ngay từ khi nhà phát triển hy vọng sẽ ngừng duy trì nó. Nó cũng mô tả sbt-native-packager như là "tổng quát hơn", cho thấy rằng bất cứ điều gì mà plugin có thể làm, sbt-native-packager cũng có thể làm. –

Trả lời

1

Mặc dù có thể lọc các tài nguyên này, tôi khuyên bạn nên đặt chúng vào một thư mục khác và thêm chúng vào đường dẫn lớp.

Sửa đổi tập lệnh bắt đầu được tạo bởi sbt-native-packager hơi phức tạp khi lớp com.typesafe.sbt.packager.archetypes.JavaAppBashScript tạo ra đường dẫn lớp là tiền tố tất cả đường dẫn có $lib_dir/. Cách tiếp cận sạch sẽ nhất có thể là cung cấp việc triển khai của riêng bạn và sử dụng để tạo ra các bashScriptDefines.

Một cách đơn giản hơn nhưng hacky sẽ được chỉ cần thêm dòng sau vào build.sbt của bạn:

packageArchetype.java_server 

// add your config files to the classpath for running inside sbt 
unmanagedClasspath in Compile += Attributed.blank(sourceDirectory.value/"main"/"config") 

// map all files in src/main/config to config in the packaged app 
mappings in Universal ++= { 
    val configDir = sourceDirectory.value/"main"/"config" 
    for { 
    file <- (configDir ** AllPassFilter).get 
    relative <- file.relativeTo(configDir.getParentFile) 
    mapping = file -> relative.getPath 
    } yield mapping 
} 

scriptClasspath ~= (cp => "../config" +: cp) 

này sẽ thêm vào trước $lib_dir/../config vào classpath kịch bản bắt đầu của bạn. Nếu ứng dụng của bạn phải chạy trên Windows, bạn sẽ phải cung cấp các cài đặt tương tự cho số batScriptDefines.

+0

Cảm ơn bạn đã đề xuất; Tôi sẽ thử chúng. Hỏi: có cách nào chỉ để ngăn chặn các tập tin của tôi (config/resource & bytecode/class) bị nén vào một cái lọ không? Sau đó, classpath sẽ giữ nguyên và tôi có thể rời khỏi tập lệnh khởi đầu như vậy? –

+0

Thực ra điều đó có nghĩa là classpath thay đổi (trong ứng dụng đóng gói) vì các lớp sẽ kết thúc trong một thư mục ở một vị trí khác. Một tùy chọn khác là thêm thuộc tính hệ thống, ví dụ: thiết lập 'bashScriptExtraDefines + =" "" addJava -Dmy.config.dir = "$ (realpath" $ {app_home} /../ config ")" "" "' và đọc nó trong chương trình của bạn nhưng điều đó sẽ cần thêm một số công việc để làm cho lệnh 'run' hoạt động độc đáo với điều đó. – Moritz

+0

"điều đó có nghĩa là đường dẫn thay đổi (trong ứng dụng đóng gói) vì các lớp sẽ kết thúc trong một thư mục ở một vị trí khác." Tôi sẽ quan tâm đến việc biết cách làm điều đó: để lại tất cả các tệp của tôi (tệp cấu hình cộng với tệp lớp) ra khỏi bất kỳ tệp jar nào. –

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