Файл класса Scala против файла класса Java - PullRequest
12 голосов
/ 30 июля 2010

Допустим, у меня есть Hello.scala.

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, world!")
  }
}

Я мог бы запустить 'scalac', чтобы получить HelloWorld.class и HelloWorld $ .class. Я могу запустить используя 'scala -classpath. Привет'. Но я не могу запустить 'java -cp. Hello».

  • Почему это? Разве Scala не взаимодействует с Java?
  • Есть ли способ запустить класс scala с Java?
  • Почему скаляр создает два файла классов?
  • Есть ли у scala что-то вроде 'lein uber'? Я имею в виду, есть ли в Scala некоторые инструменты, которые генерируют один JAR-файл для распространения?

Плагин IntelliJ + scala

Я мог бы получить банку, содержащую все для запуска файла scala, с плагином IntelliJ + scala, я думаю, что это лучший вариант, чем proguard.

Настройка Proguard

Благодаря Морицу я мог сделать один файл jar, который будет работать с java. Это общая структура.

|-- classes
|   |-- HelloWorld$.class
|   |-- HelloWorld.class
|   `-- META-INF
|       `-- MANIFEST.MF
`-- your.pro

your.pro имеет следующее содержимое.

-injar classes
-injar /Users/smcho/bin/scala/lib/scala-library.jar(!META-INF/MANIFEST.MF)
-outjar main.jar
-libraryjar /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Classes/classes.jar

-dontwarn
-dontnote
-ignorewarnings

-optimizationpasses 2
-optimizations !code/allocation/variable

-keep,allowoptimization,allowshrinking class * { *; }
-keepattributes SourceFile,LineNumberTable

-keepclasseswithmembers public class HelloWorld { public static void main(java.lang.String[]); }

MANIFEST.MF имеет следующую настройку. Не забудьте включить [CR] или пустую строку.

Main-Class: HelloWorld

Я загружаю proguard 4.5.1, чтобы поместить его в ~ / bin / proguard4.5.1. Запустив proguard, я мог сделать банку (main.jar), и она отлично работает.

prosseek:classes smcho$ java -Xmx512m -jar /Users/smcho/bin/proguard4.5.1/lib/proguard.jar @your.pro

ProGuard, version 4.5.1
Reading program directory [/Users/smcho/Desktop/scala/proguard/classes/classes]
Reading program jar [/Users/smcho/bin/scala/lib/scala-library.jar] (filtered)
Reading library jar [/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar]
Preparing output jar [/Users/smcho/Desktop/scala/proguard/classes/main.jar]
  Copying resources from program directory [/Users/smcho/Desktop/scala/proguard/classes/classes]
  Copying resources from program jar [/Users/smcho/bin/scala/lib/scala-library.jar] (filtered)
prosseek:classes smcho$ java -jar main.jar hello

или

java -cp main.jar HelloWorld

Я загружаю файл примера zip здесь . И, скалярный исходный код здесь .

1 Ответ

12 голосов
/ 30 июля 2010

Вам нужно добавить Scala в classpath, например

-classpath scala-library.jar:.

или добавив

-Xbootclasspath/a:scala-library.jar

к аргументам виртуальной машины.

Дополнение:

Извините, не видел этот последний вопрос. Если вы хотите распространять отдельные JAR-файлы, многие люди используют ProGuard для доставки классов, необходимых из scala-library.jar, вместе с вашими классами в один jar.

Второе редактирование:

Предполагая, что у вас есть .class-файлы и ваша папка META-INF, содержащая MANIFEST.MF в папке с именем classes, вы можете использовать следующую конфигурацию Proguard (после настройки путей, например, вам нужен rt.jar в Linux / Windows вместо classes.jar в Mac OS) сохранено, например как your.pro:

-injar classes
-injar /opt/local/share/scala-2.8/lib/scala-library.jar(!META-INF/MANIFEST.MF)
-outjar main.jar
-libraryjar /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Classes/classes.jar

-dontwarn
-dontnote
-ignorewarnings

-optimizationpasses 2
-optimizations !code/allocation/variable

-keep,allowoptimization,allowshrinking class * { *; }
-keepattributes SourceFile,LineNumberTable

-keepclasseswithmembers public class your.Main { public static void main(java.lang.String[]); }

Теперь вы можете создать main.jar с помощью

java -Xmx512m -jar proguard.jar @your.pro

В конце концов вы должны установить -Xmx немного выше. Дополнительную информацию можно найти на SBT Wiki .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...