2016-09-30 3 views
0

Я пытаюсь упаковать неуправляемую банку вместе с некоторым кодом Scala. Я программирую с помощью IntelliJ, и я не уверен, правильно ли построен пакет.Является ли это build.sbt нормально для упаковки?

Мой 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" 
} 

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

EDIT: После прочтения комментария г-Форда, вот предупреждения и ошибки, которые я получаю от работы ikvmc на сгенерированной баночке:

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 будет отфильтровано. Если у вас нет веских оснований для этого, я бы избавился от него и явно указал основной метод пакета. Что mappings делает это described here.

+0

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

+0

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

Смежные вопросы