Подходит ли этот build.sbt для упаковки?

#scala #jar #sbt

#scala #jar #sbt

Вопрос:

Я пытаюсь упаковать неуправляемый jar вместе с некоторым кодом Scala. Я программирую, используя IntelliJ, и я не уверен, правильно ли собирается пакет.

Мой build.sbt заключается в следующем:

 name := "InvokeCompiler"

version := "1.0"

scalaVersion := "2.11.8"

exportJars := true

val parserLocation = "lib/parser-0.0.1.jar"

mappings in (Compile, packageBin) ~= {

    _.filter(!_._1.getName.startsWith("Main"))
}

//unmanagedJars in Compile  = file(parserLocation)

mappings in (Compile, packageBin) < = baseDirectory map { base =>

    (base / parserLocation) -> "parser-0.0.1.jar"
}
  

Я хочу создать новый файл jar, содержащий неуправляемый jar и код, который я написал. Этот jar будет преобразован в a .dll для использования в C #. Но при этом IKVMC выдает всевозможные предупреждения. Когда я добавляю .dll , он создает .dll единственный класс, который я написал сам.

РЕДАКТИРОВАТЬ: после прочтения комментария мистера Форда, вот предупреждения и ошибки, которые я получаю при запуске ikvmc в сгенерированном jar:

 PROMPT:> ikvmc -target:library compiled.jar
IKVM.NET Compiler version 7.2.4630.5
Copyright (C) 2002-2012 Jeroen Frijters
http://www.ikvm.net/

note IKVMC0002: Output file is "compiled.dll"
warning IKVMC0100: Class "org.nlogo.core.FrontEndInterface" not found
warning IKVMC0100: Class "scala.Tuple2" not found
warning IKVMC0100: Class "scala.reflect.ScalaSignature" not found
warning IKVMC0100: Class "scala.Option" not found
warning IKVMC0100: Class "org.nlogo.core.Program" not found
warning IKVMC0100: Class "scala.collection.immutable.ListMap" not found
warning IKVMC0100: Class "org.nlogo.core.ExtensionManager" not found
warning IKVMC0100: Class "org.nlogo.core.CompilationEnvironment" not found
warning IKVMC0100: Class "org.nlogo.core.Femto$" not found
warning IKVMC0111: Emitted java.lang.NoClassDefFoundError in "Interface.ASTSingleton$.getFrontEndCompiledAsJSON(Ljava.lang.String;)Lscala.Tuple2;"
    ("org.nlogo.core.FrontEndInterface")
warning IKVMC0111: Emitted java.lang.NoClassDefFoundError in "Interface.ASTSingleton$.getFrontEndSingletion()Lorg.nlogo.core.FrontEndInterface;"
    ("org.nlogo.core.Femto$")
  

Ответ №1:

Вы не говорите, как вы его создаете, так что это может быть первой проблемой. В частности, вы должны использовать sbt publish-local команду. Чтобы убедиться, что зависимость включена, просто распакуйте файл JAR и посмотрите.

Если вам нужно, чтобы результирующий файл JAR был исполняемым, вам следует добавить это в свой build.sbt :

 mainClass in Compile := Some("name.of.your.main.Class")
  

Замените name.of.your.main.Class на ваше имя класса. Вы делаете что-то подобное, но потенциально проблематичное:

 mappings in (Compile, packageBin) ~= {
    _.filter(!_._1.getName.startsWith("Main"))
}
  

Это означает, что все, что имеет имя класса, которое не начинается с Main , будет отфильтровано. Если у вас нет веской причины для этого, я бы избавился от него и явно указал метод package main . Что mappings делает, описано здесь .

Комментарии:

1. Я не хочу, чтобы у jar был метод main, я хочу, чтобы это была библиотека, вот и все. при извлечении содержимого результирующего jar, кажется, добавляются все зависимости. Тогда остается вопрос, почему ikvmc не может преобразовать его в dll. Спасибо, по крайней мере, кажется, что мой sbt в порядке. 🙂

2. @Marin Рад помочь! Не забудьте проголосовать и / или принять ответы, которые помогут вам найти решение или прояснить эту ситуацию. Поступая таким образом, у людей будет больше шансов помочь вам в будущем! Я бы также обновил ваш исходный пост с предупреждениями, которые вы получаете, поскольку это может дать больше подсказок, которые позволят нам вам помочь.