2010-05-27 12 views
11

Tôi có một dự án Scala trong Eclipse mà tôi cần đóng gói để tôi có thể triển khai nó đến một máy chủ. Nó dựa trên Jetty nhưng nó chạy như một ứng dụng độc lập. Nó chứa các lớp Scala, các lớp Java và một số lọ bên thứ 3.Làm thế nào để triển khai một dự án Scala từ Eclipse?

Tôi cho rằng sẽ có một số tùy chọn triển khai trong plugin Eclipse Scala nhưng tôi đã vẽ một khoảng trống.

Cách đơn giản nhất để đóng gói dự án Scala vào tệp runnable để nó có thể được triển khai là gì?

Bất kỳ trợ giúp nào được đánh giá cao. Chúc mừng.

Trả lời

5

Sau rất nhiều thử và sai, đây là phương pháp tốt nhất mà tôi tìm thấy cho đóng gói ứng dụng Scala để phân phối:

Đầu tiên, tạo một lớp Java là điểm vào chính cho ứng dụng như mô tả của Gary Boon . Điều này cho phép bạn chạy ứng dụng từ một JAR với lệnh java. Tôi thấy rằng chạy một lớp Scala với lệnh java là có vấn đề, ngay cả khi bạn có libs Scala trên con đường nguồn:

import java.util.ArrayList; 

import scala.tools.nsc.MainGenericRunner; 


public class Main { 
    public static void main (String[] args) { 
     ArrayList<String> argList = new ArrayList<String>(); 
     argList.add("fully.qualified.ClassName"); 
     for (String s : args) { 
      argList.add(s); 
     } 
     MainGenericRunner.main(argList.toArray(new String[0])); 
    } 
} 

Bây giờ bạn có thể sử dụng Xuất Runnable JAR lệnh của Eclipse để gói lên tất cả lớp học của bạn và các thư viện vào một tệp JAR. Đặt lớp chính của JAR đến điểm vào Java. Bạn cũng có thể lưu các cài đặt đầu ra do Eclipse tạo ra như một tệp xây dựng ANT để bạn có thể thực hiện các điều chỉnh. Sử dụng ANT để tạo JAR với một điểm vào Java mang lại kết quả tốt nhất. Bạn cũng có thể đóng gói các phụ thuộc JAR khác theo cách này, điều này làm cho nó đơn giản hơn rất nhiều khi cố gắng chạy JAR trên một máy chủ khác. Tối thiểu bạn sẽ cần thư viện Scala và các công cụ Scala JAR.

<zipfileset excludes="META-INF/*.SF" src="${scala.lib.jar}"/> 
<zipfileset excludes="META-INF/*.SF" src="${scala.tools.jar}"/> 

Nếu bạn đang sử dụng nhúng Jetty, như tôi, bạn có thể chạy các máy chủ như một quá trình Daemon bằng cách sử dụng lệnh sau đây (source):

nohup java -jar MyJettyServer.jar </dev/null>> server.log 2>> server_error.log & 

này chạy chương trình như một nền tảng quá trình độc lập với phiên người dùng hiện tại để quá trình này sẽ tiếp tục sau khi bạn đăng xuất máy chủ lưu trữ.

5

Sbt supports web application deployments. Tất nhiên bạn có thể sử dụng Ant, Maven hoặc các công cụ xây dựng khác để đóng gói WAR của bạn để triển khai Jetty. Bạn có thể bắt đầu sbt như một công cụ bên ngoài từ nhật thực.

Sbt dường như hỗ trợ cấu hình JRebel. Một khi nó chạy bạn sẽ có thể thay đổi tài nguyên và các lớp học từ nhật thực mà không cần một bước triển khai chiến tranh bổ sung.

+0

Cảm ơn bạn đã nhập Thomas. Tôi sợ tôi là một chút của một newb khi nói đến công cụ xây dựng Java. Tôi không chắc chắn nếu một tập tin WAR là những gì tôi muốn. Tôi đang chạy Jetty trong chế độ nhúng vì vậy tôi đã hy vọng để gói tất cả mọi thứ lên trong một JAR runnable hoặc một cái gì đó. Hay tôi đang sủa cây sai? – lach

+0

WAR là tiêu chuẩn (Tệp lưu trữ ứng dụng web SRV.9.6 - http://jcp.org/aboutJava/communityprocess/mrel/jsr154/index2.html) cách đóng gói ứng dụng của bạn cho một thùng chứa servlet (http: // wiki.eclipse.org/Jetty/Howto/Deploy_Web_Applications). –

2

Tôi đang làm chính xác điều tương tự: phát triển mã phía máy chủ chạy bên trong ứng dụng đơn giản nhúng Jetty. Ngày nay nó chủ yếu là mã Scala, nó từng là Java. Dù bằng cách nào tôi chỉ cần chạy mã Java từ một hoặc nhiều tệp JAR.

Trong cả hai trường hợp, tôi sử dụng Ant cho các bản dựng triển khai. Đôi khi các dự án Scala của tôi sử dụng các lớp Java hiện có. Để làm điều đó, tôi thêm một mục tiêu Ant để biên dịch các lớp Java thành một JAR mà sau đó được sử dụng cả trong trình cắm thêm Eclipse Scala của tôi và trong các mục tiêu xây dựng triển khai Ant.

+0

Xin chào Silvio. Cảm ơn! Điều đó nghe có vẻ giống như những gì tôi cần. Bạn có thể đăng một ví dụ về tệp ANT mà bạn sử dụng để xây dựng ứng dụng máy chủ của mình không? – lach

+0

Bạn có thể tìm thấy một ví dụ vụng về tại: http://www.jambo-software.com/download/build.xml –

0

Bạn sử dụng khả năng tạo tập tin WAR của eclipses, giống như bạn làm với Java. Hoặc một tệp jar, giống như bạn làm cho Java. Bởi vì, vào thời gian chạy nó là java. Không cần thêm ma thuật nữa.

+0

Không, điều này không hiệu quả đối với tôi. Không có tùy chọn có thể chọn để lớp thực thi khi bình được chạy. Có lẽ nếu bạn làm thủ công cái bình thì nó sẽ hoạt động? – fadedbee

2

Một giải pháp đơn giản là tạo một lớp Java nhỏ gọi phương thức chính của chương trình Scala. Sau đó, xuất khẩu jar nhật thực tiêu chuẩn có thể được sử dụng.

public class Main { 
    public static void main (String[] args) { 
     MyScalaObjectWithMainMethod.main(args); 
    } 
} 

Chú ý: Trước khi xuất khẩu chắc chắn rằng scala-library.jar là trong con đường xây dựng như một jar bên ngoài (không phải là một thư viện) để nó sẽ được xuất khẩu cùng với jar của bạn.

Tôi đã tìm thấy giải pháp này dưới dạng nhận xét của Jesper Villadsen về số Gary Boone's page (người đề xuất phương pháp tiếp cận hơi phức tạp). Trong khi tôi gặp vấn đề khi chạy giải pháp của Gary, giải pháp này của Jesper hoạt động hoàn hảo cho tôi. Cảm ơn!