快速背景: 我们发布了一个webstart应用程序,其中包括我们自己的应用程序罐和众多第三方jar.Webstart要求jnlp文件引用的所有分布式jar都由单个证书签名.因此,我们使用自签名证书签署所有罐子(我们的罐子和第三方罐子).一些第三方罐子已经由生产它们的一方签署,但我们只是再次签署它们,这很好.到现在.
问题: 我们最近从Java 6迁移到Java 7,突然webstart拒绝加载一些jar,抱怨:"无效的SHA1签名文件摘要".这只发生在一些罐子而不是其他罐子上,并且那些失败的罐子似乎有多个签名.
在搜索SO和互联网之后,似乎Java的jarsigner的默认签名算法在Java 6和Java 7之间已经发生了变化,从SHA1到SHA256,并且各种人都建议使用"jarsigner -digestalg SHA1"来解决验证问题.我试过了,果然我们的多重签名罐子验证了.所以这似乎是我们问题的解决方法.
从我可以收集到的内容来看,第三方签名似乎是SHA1签名,我们使用默认签名 - SHA256签名 - 导致签名混合.当我使用'-digestalg'开关强制SHA1时,我们有两个相同类型的签名,验证现在可以正常工作.所以似乎这个问题是由多个签名使用不同的算法引起的?或者还有其他一些我缺失的因素.
问题:
我正在寻找一个数据结构的Java实现,它包含一个元素集合,其中定义了一个部分排序,并允许一个元素以某种拓扑顺序迭代这些元素(任何可能的排序都很好;最好是一个稳定的订购作为集合的内容更改).
理想情况下,它将实现一个Collection<E>,Set<E>或SortedSet<E>接口,并支持接口上的所有方法.在指定总排序方面,可以使用a来实例化集合Comparator<E>,并且ClassCastException如果被比较的两个元素没有相对于彼此排序,则比较器可以抛出异常(?).作为奖励,如果插入的元素会产生排序异常(元素的有序图中的循环),它将抛出异常.
所以是的,我想要的是一个拓扑排序,但是我想要一个集合对象,它在每次插入/删除时保持排序顺序,类似于SortedSet如何按排序顺序维护集合.
这样的事情存在吗?在一些开源库中?
参考文献:
http://en.wikipedia.org/wiki/Partially_ordered_set
http://en.wikipedia.org/wiki/Topological_sorting
更新
在我意识到我的要求的性能影响(以及我无法解决的各种其他问题,使用poset)之后,我最终采用了不同的方法解决了我的问题,我不需要一个poset.依靠比较器来确定元素之间的顺序意味着对于元素插入,我必须针对每个现有元素查询比较器,每次插入花费O(n).
如果性能不是很重要(确实如此),并且如果元素的数量被限制在合理的范围内(事实并非如此),我想我会采用Willie建议的方法,尽管可能使用我自己的图形实现和拓扑排序实现以最小化依赖性.
我正在尝试学习Shapeless,我想定义一个monoid,它将无形记录的实例加在一起.请注意,我使用的是algebird monoids(不是scalaz),但我确信它们非常相似.以下是我希望能够做到的一个例子:
val result = Monoid.sum(
('a ->> 1) :: ('b ->> 1) :: HNil,
('a ->> 4) :: ('b ->> 3) :: HNil,
('a ->> 2) :: ('b ->> 6) :: HNil)
// result should be: ('a ->> 7) :: ('b ->> 10) :: HNil
Run Code Online (Sandbox Code Playgroud)
我想出了如何为HList编写monoid实例,如下所示:
implicit val HNilGroup: Group[HNil] = new ConstantGroup[HNil](HNil)
implicit val HNilMonoid: Monoid[HNil] = HNilGroup
class HListMonoid[H, T <: HList](implicit hmon: Monoid[H], tmon: Monoid[T]) extends Monoid[::[H, T]] {
def zero = hmon.zero :: tmon.zero
def …Run Code Online (Sandbox Code Playgroud) 是什么原因导致“ java.lang.IncompatibleClassChangeError:vtable存根”?在我们的应用程序中,我们已经看到此错误是随机且很少出现的(到目前为止只有两次,并且我们经常运行它)。即使使用相同的jvm / jars重新启动应用程序而不重建,它也不容易重现。
至于我们的构建过程,我们清除所有类/ jar并重新构建它们,因此这与其他人在一个类中进行了更改而未重新编译其他一些依赖类时遇到的问题不同。
这与与IncompatibleClassChangeError相关的其他一些问题不同-他们都没有提到“ vtable stub”。实际上,搜索“ IncompatibleClassChangeError“ vtable stub”“时,谷歌搜索结果很少。
编辑:
Oracle JDK附带的tools.jar是否可以与依赖它的商业产品一起分发(即,根据Oracle许可证的条款,合法地)?无论是或否,请提供参考以证实您的答案.
我需要从蚂蚁那里打电话给sbt.我正在使用"exec"任务执行此操作,如下所示:
<target name="publish-jar">
<exec executable="sbt.bat" failonerror="true">
<arg value="publish"/>
</exec>
</target>
Run Code Online (Sandbox Code Playgroud)
如果sbt任务失败,我需要ant任务"失败",这就是使用的原因failonerror="true".但是,这不起作用.当sbt任务失败时,ant不会报告失败的构建.
这看起来像这里讨论的问题: Ant exec resultproperty不起作用.建议的解决方法是从中删除"/ B" sbt.bat.换句话说,改变:
exit /B %ERROR_CODE%
Run Code Online (Sandbox Code Playgroud)
至
exit %ERROR_CODE%
Run Code Online (Sandbox Code Playgroud)
但是,正如一位评论者所说:
这样做的缺点是,如果直接运行批处理文件进行测试,它将终止你的shell.您可以在批处理文件中使用if和arg来选择\ b,当ant调用它时,正常退出时不选择.
问题: 当发生故障时是否有修复:(1)不终止调用者的shell和(2)将退出代码传播给ant?
这是运行我的ant任务的输出.实际错误在这里并不重要(我故意不配置存储库来发布,强制错误):
C:\dev\la\sdf3\modules\test>ant publish-jar
Buildfile: C:\dev\la\sdf3\modules\test\build.xml
publish-jar:
[exec] [info] Loading global plugins from C:\Users\jn\.sbt\0.13\plugins
[exec] [info] Set current project to test (in build file:/C:/dev/la/sdf3/modules/test/)
[exec] :: loading settings :: file = C:\dev\la\sdf3\modules\ivysettings.xml
[exec] [info] :: delivering :: com.jn#test;SNAPSHOT ::
SNAPSHOT :: integration :: Fri Mar 14 08:45:58 HST …Run Code Online (Sandbox Code Playgroud) 请参阅下面的源代码.所有源代码都在同一个包中定义.当我定义一个源文件中的所有代码ShowMain.scala,我得到一个编译错误,但是当object ShowMain在被定义ShowMain.scala并trait Show与object Show中定义Show.scala,也没有编译错误.
我的问题: 这是什么原因?我遇到了什么语言规则?
示例代码:
object ShowMain {
def main(args: Array[String]): Unit = {
output("hello")
}
def output[A](a: A)(implicit show: Show[A]) =
println(show.show(a))
}
trait Show[-A] {
def show(a: A): String
}
object Show {
implicit object StringShow extends Show[String] {
def show(s: String) = s"[String: $s]"
}
}
Run Code Online (Sandbox Code Playgroud)
编译错误:
(ScalaIDE/Scala 2.11.2在线包含output("hello"))
Multiple markers at this line
- not enough arguments for method output: …Run Code Online (Sandbox Code Playgroud)