4

私は自分のプロジェクトをIntelliJ9.0でjarとしてエクスポートしようとしています。私のプロジェクトはIntellijで問題なくコンパイルおよび実行されますが、.jarに書き込んで開くと、エラーが表示されます。

私のメインクラスは次のようなものです。

package Main

//Imports

object Main{
  def main(args: Array[String]) {
    println("Main: Hello, world!")
    //do stuff
}

ここで、アーティファクトウィンドウで、次の.jarを作成しました。

  1. メインクラス:Main.Main
  2. クラスパス:lib/javacsv lib/scala-compiler.jar lib/scala-library.jar lib/scalatest-1.0-test.jar lib/scalatest-1.0.jar lib/tools.jar lib/jtds-1.2.2.jar lib/flex-messaging-common.jar lib/flex-messaging-core.jar lib/spring.jar lib/mysql-connector-java-5.1.7-bin.jar lib/ojdbc14.jar lib/commons-logging.jar lib/postgresql-8.4-701.jdbc3.jar lib/log4j-1.2.15.jar lib/poi-3.6-20091214.jar lib/poi-ooxml-3.6-20091214.jar lib/dom4j-1.6.1.jar lib/poi-ooxml-schemas-3.6-20091214.jar lib/geronimo-stax-api_1.0_spec-1.0.jar lib/xmlbeans-2.3.0.jar lib/rt.jar lib/ifxjdbc.jar lib/db2jcc4.jar

これらのクラスがすべてプロジェクトにあり、プロジェクトに含まれているクラスであることを再確認しました。とが含まれていることに注意してlib/scala-compiler.jarくださいlib/scala-library.jar

プロジェクトをビルドします:java -jar myScalaApp.jarそして私は次のようになります:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:288)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)
    at Main.Main.main(Main.scala)
Caused by: java.lang.ClassNotFoundException: scala.ScalaObject
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:288)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)
    ... 13 more

私はそれがscalaクラスを見つけていないことを理解していますが、それらがそこにあることを確認しました。他に何が問題になる可能性があり、どうすれば修正できますか?

4

2 に答える 2

5

2つのうちの1つがうまくいかなかったと思います。

  • scala-library.jarあなたの瓶にはありません。また
  • 実行時のクラスパスにはが含まれていませんscala-library.jar

IntelliJがどのようにjarを構築するのかわかりません:すべてのライブラリjarを解凍して、コードと一緒に1つの大きなjarに変更しますか、それともライブラリjarをそのまま大きなjarに追加し、クラスパスを操作して取得しますか? jars-within-jarで?

最初のポイントは簡単に確認できjar -tvf yourJar.jarます。jarの内容を一覧表示するために使用するか、アーカイブビューアを使用してグラフィカルに調べます。a.jarは基本的には.zipであるため、拡張子の名前を変更してから、ファイルを調べることができるツールを使用でき.zipます。

2番目の部分について考えたばかりです。出力する単純なJavaメインクラスを構築できますSystem.getProperty("java.class.path")か?Scalaクラスが実行されていない場合でも、Javaクラスはそのjarで実行できるはずです。

于 2010-07-21T07:57:55.730 に答える
2

There are at least three ways to do this. (One applies to Netbeans but should work in Idea too)

  • Use jarjar as explained here
  • Use the idea on this page (not so elegant but the easiest) - essentially unpack the Scala directory from scala-library.jar and add this directory to your jar.
  • Use the idea on this page (for NB) - essentially add "scala-library.jar" to your project libraries.
于 2011-03-17T11:59:06.380 に答える