2011-11-09 12 views

Odpowiedz

14

Jest to całkowicie możliwe, patrz na przykład to: running a maven scala project. Ponieważ Scala kompiluje się do kodu bajtowego Java, JVM nie jest nawet świadomy podstawowego języka implementacji.

W zasadzie po skompilowaniu źródeł Scala za pomocą scalac otrzymasz kilka plików .class, które możesz później spakować do pliku JAR. Następnie można po prostu uruchomić je przy użyciu:

$ java -cp "your.jar:scala-library.jar" com.example.Main 

pamiętać, że koniecznością zawierać scala-library.jar na CLASSPATH (obecnie jest to prawie 9 MiB ...) i określić klasę zawierającą main metody.

15

Jeśli używasz sbt do budowania, możesz użyć jednej z wtyczek o jednym słoiku. Wszystkie zależności zostaną umieszczone w jednym dużym pliku JAR (zawierającym wszystkie pliki scala.jar). Oznacza to, że potrzebujesz tylko jednego pliku jar i nie musisz zarządzać wszystkimi zależnościami.

przykładu SBT montażu (głównie kopiowany z https://github.com/sbt/sbt-assembly):

projekt/plugins.sbt:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "X.X.X") 

build.sbt:

import AssemblyKeys._ // put this at the top of the file 
seq(assemblySettings: _*) 

następnie generuje słoik z:

sbt assembly 
+1

Ten adres URL nie działa. Spróbuj https://github.com/sbt/sbt-assembly –

5

Jako alternatywę dla odpowiedzi Fabiana, jeśli używasz Mavena, możesz użyć wtyczki zespołu. Coś jak:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>package-jar-with-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <appendAssemblyId>true</appendAssemblyId> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <archive> 
        <manifestEntries> 
         <SplashScreen-Image>splash.png</SplashScreen-Image> 
        </manifestEntries> 
        <manifest> 
         <mainClass>se.aptly.epm.main.PrognosisApp</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

To będzie spakować wszystkie swoje deps się, w tym scala-library.jar (jeśli jest to w twoich dużą liczbą wykazywanych zależności), ale nie będzie tak spłaszczone ze wszystkich klas rozpakowany. Dzieje się tak dlatego, że działające słoiki nie mogą wyjść z pudełka, używając kodu w słoikach w słoiku.

Aby dokonać tej pracy (który jest ładniejszy), użyj http://code.google.com/p/onejar-maven-plugin/, myślę, że to Maven mojo wrapper do jednej słoika: http://one-jar.sourceforge.net/

Istnieje również SBT-plugin dla jednej słoika: https://github.com/sbt/sbt-onejar

1

W celu spakowania aplikacji Swing w runnable słoik, roztwór, który pracował dla mnie było wyeksportować swój projekt jako normalny słoik pliku wykonywalnego (non) i zaktualizuj słoik na manifest do:

  1. dodać scala-library.jar scala-swing.Pakiety jar ścieżce
  2. wskazać główne klasy

Można znaleźć plik Manifest wewnątrz słoika (które można otworzyć z 7z na przykład) w następującej ścieżce:

META-INF/MANIFEST.MF 

Dodaj następujące wiersze na końcu manifestu:

Main-Class: myPackage.myMainClass 
Class-Path: scala-library.jar scala-swing.jar 

Teraz twój słoik powinien zostać poprawnie wykonany po kliknięciu.

UWAGA: Więcej informacji na temat manifestowania można znaleźć tutaj: http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html.

0

Hers jest moim rozwiązaniem, maven -> stworzyć scala runnable jar.

 <plugin> 
      <groupId>org.scala-tools</groupId> 
      <artifactId>maven-scala-plugin</artifactId> 
      <version>2.15.2</version> 
      <executions> 
       <execution> 
        <id>scala-compile-first</id> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
        <configuration> 
         <includes> 
          <include>**/*.scala</include> 
         </includes> 
        </configuration> 
       </execution> 
       <execution> 
        <id>scala-test-compile</id> 
        <goals> 
         <goal>testCompile</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>xxx.xxx.xxx.Main</mainClass> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>reference.conf</resource> 
          </transformer> 
         </transformers> 
         <filters> 
          <filter> 
           <artifact>*:*</artifact> 
           <excludes> 
            <exclude>META-INF/*.SF</exclude> 
            <exclude>META-INF/*.DSA</exclude> 
            <exclude>META-INF/*.RSA</exclude> 
           </excludes> 
          </filter> 
         </filters> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin>