2010-05-27 11 views
11

Mam projekt Scala w środowisku Eclipse, który muszę spakować, aby móc wdrożyć go na serwerze. Jest oparty na Jetty, ale działa jako samodzielna aplikacja. Zawiera klasy Scala, klasy Java i wiele słoików innych firm.Jak wdrożyć projekt Scala z Eclipse?

Zakładam, że w pluginach Scala Eclipse pojawi się jakaś opcja instalacji, ale narysowałem pustą.

Jaki jest najprostszy sposób na spakowanie projektu Scala do pliku działającego, aby można go było wdrożyć?

Każda pomoc mile widziana. Pozdrawiam.

Odpowiedz

5

Po wielu prób i błędów, to jest najlepsza metoda znalazłem do pakowania aplikacji Scala dla dystrybucji:

Najpierw należy utworzyć klasę Java, aby być głównym punktem wejścia do stosowania w sposób opisany przez Gary Boon . Dzięki temu można uruchomić aplikację z pliku JAR za pomocą komendy java. Okazało się, że działa klasę Scala za pomocą polecenia java jest problematyczne, nawet gdy masz bibliotekami Scala na ścieżce źródło:

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])); 
    } 
} 

Teraz można wykorzystać Export Runnable JAR polecenia Eclipse spakować wszystkie swoje zajęcia i biblioteki do pliku JAR. Ustaw główną klasę JAR na punkt wejścia Java. Można również zapisać ustawienia wyjściowe generowane przez Eclipse jako plik kompilacji ANT, aby można było wprowadzić poprawki. Użycie ANT do utworzenia pliku JAR z punktem wejścia Java przyniosło najlepsze rezultaty. Możesz także spakować inne zalewki JAR w ten sposób, co znacznie upraszcza próbę uruchomienia JAR na innym hoście. Jako minimum będziesz potrzebował biblioteki Scala i narzędzia JAR Scala.

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

Jeśli używasz osadzone Jetty, jak ja, można uruchomić serwer jako proces demona za pomocą następującego polecenia (source):

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

Ten program działa w tle proces, który jest niezależny od bieżącej sesji użytkownika, więc proces będzie kontynuowany po wylogowaniu z hosta.

5

Sbt supports web application deployments. Możesz oczywiście użyć Ant, Maven lub innych narzędzi do kompilacji, aby spakować instalację WAR na Jetty. Możesz zacząć sbt jako zewnętrzne narzędzie od zaćmienia.

Wygląda na to, że Sbt obsługuje konfigurację JRebel. Po uruchomieniu powinieneś być w stanie zmienić zasoby i klasy z zaćmienia bez dodatkowego kroku wdrażania wojny.

+0

Dzięki za wiadomość Thomas. Obawiam się, że jestem trochę początkującym, jeśli chodzi o narzędzia do budowania Java. Nie jestem pewien, czy plik WAR jest tym, czego chcę. Używam Jetty w trybie wbudowanym, więc miałem nadzieję spakować wszystko do działającego JAR-a lub czegoś podobnego. Czy mogę szczekać złe drzewo? – lach

+0

WAR jest standardem (plik archiwum aplikacji sieci Web SRV.9 - http://jcp.org/aboutJava/communityprocess/mrel/jsr154/index2.html) sposób na spakowanie aplikacji dla kontenera serwletów (http: // wiki.eclipse.org/Jetty/Howto/Deploy_Web_Applications). –

2

Robię dokładnie to samo: opracuj kod po stronie serwera, który działa w zwykłej aplikacji, która osadza Jetty. Obecnie jest to głównie kod Scala, kiedyś Java. Tak czy inaczej, po prostu uruchamiam kod Java z jednego lub więcej plików JAR.

W obu przypadkach używam Anta do kompilacji instalacji. Moje projekty Scala czasami używają istniejących klas Java. Dodałem do tego obiekt Ant, który kompiluje klasy Java do pliku JAR, który jest następnie używany zarówno w mojej wtyczce Eclipse Scala, jak i w obiektach docelowych instalacji wdrażania Ant.

+0

Witaj Silvio. Dzięki! To brzmi jak to, czego potrzebuję. Czy możesz wysłać przykład pliku ANT, którego używasz do budowy aplikacji serwerowej? – lach

+0

Można znaleźć niezręczny przykład: http://www.jambo-software.com/download/build.xml –

0

Korzystasz z funkcji zaćmienia, aby utworzyć plik WAR, tak jak w przypadku Java. Lub plik jar, tak jak w przypadku Javy. Ponieważ w czasie wykonywania jest to Java. Nie potrzeba więcej magii.

+0

Nie, to nie działa dla mnie. Nie ma żadnej możliwej do wyboru opcji, aby klasa mogła zostać wykonana po uruchomieniu słoika. Może gdybyś ręcznie słoik działał? – fadedbee

2

Prostym rozwiązaniem jest utworzenie małej klasy Java, która wywołuje główną metodę programu Scala. Następnie można użyć standardowego eksportu słoika Eclipse.

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

Ważne: Przed eksportem upewnij się, że scala-library.jar znajduje się na ścieżce kompilacji jako zewnętrznych słoju (nie jako biblioteki), dzięki czemu będzie eksportowane wraz z słoika.

Znalazłem to rozwiązanie jako komentarz Jespera Villadsena na Gary Boone's page (który proponuje nieco skomplikowane podejście). Podczas gdy miałem problemy z uruchomieniem rozwiązania Gary'ego, to rozwiązanie Jespera działa idealnie dla mnie. Dzięki!

Powiązane problemy