Командная строка Windows очень ограничивает в этом отношении. Обходное решение должно создать "банку соединения каналом". Это - банка, содержащая только Manifest.mf
файл, чей Class-Path
определяет дисковые пути Вашего длинного списка банок, и т.д. Теперь просто добавьте этот банка соединения каналом к Вашему пути к классу командной строки. Это обычно более удобно, чем упаковка фактических ресурсов вместе.
, Поскольку я вспоминаю, дисковые пути могут быть относительно банка соединения каналом сама. Так эти Manifest.mf
мог бы выглядеть примерно так:
Class-Path: this.jar that.jar ../lib/other.jar
, Если Ваш банка соединения каналом будет содержать главным образом основополагающие ресурсы, то она не будет изменяться слишком часто, но Вы, вероятно, все еще захотите генерировать его где-нибудь в Вашей сборке. Например:
<jar destfile="pathing.jar">
<manifest>
<attribute name="Class-Path" value="this.jar that.jar ../lib/other.jar"/>
</manifest>
</jar>
Короткий ответ заключается в том, что вы можете использовать несколько трейтов - они «складываются». Кроме того, у трейтов не может быть параметров конструктора.
Вот как трейты складываются в стек. Обратите внимание на важность порядка следования признаков. Они будут звать друг друга справа налево.
class Ball {
def properties(): List[String] = List()
override def toString() = "It's a" +
properties.mkString(" ", ", ", " ") +
"ball"
}
trait Red extends Ball {
override def properties() = super.properties ::: List("red")
}
trait Shiny extends Ball {
override def properties() = super.properties ::: List("shiny")
}
object Balls {
def main(args: Array[String]) {
val myBall = new Ball with Shiny with Red
println(myBall) // It's a shiny, red ball
}
}
Этот сайт дает хороший пример использования черт. Одним из больших преимуществ трейтов является то, что вы можете расширять несколько трейтов, но только один абстрактный класс. Черты решают многие проблемы с множественным наследованием, но позволяют повторно использовать код.
Если вы знакомы с рубином, черты его похожи на примеси