2016-09-30 55 views
0

我想打包一個非託管jar以及一些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" 
} 

我要讓包含非託管的罐子,我寫的代碼一個新的jar文件。這個jar將被轉換爲.dll在C#中使用它。但是,當這樣做時,IKVMC會發出各種警告。當我添加.dll時,它生成.dll只包含我自己寫的類。

編輯: 閱讀福特先生的評論後,這裏的警告和錯誤,我從生成的JAR運行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

我不希望jar有一個主要方法,我希望它是一個lib,就是這樣。通過提取生成的jar的內容,似乎所有的依賴關係都被添加了。那麼問題依然是爲什麼ikvmc無法將其轉換爲dll。謝謝,至少看起來我的感覺沒問題。 :) – Marin

+0

@Marin樂於幫忙!請記住點贊和/或接受幫助您找到解決方案的答案,或闡明這種情況。通過這樣做,人們將來會更有可能幫助你!我還會更新您的原始文章,並提供您收到的警告,因爲它可能會提供更多線索,讓我們爲您提供幫助。 –