我已经将我正在使用的脚本发布到StackExchange Code Review站点.
我原来的问题是,有没有办法可以使用X.509证书和时间戳签署Git提交?.有一段时间我以为我只能用我的X.509证书签署的东西,我的X.509证书由一个受信任的第三方加盖时间戳.不是这种情况.使用X.509证书和可信时间戳进行数字签名是互斥的.我已更新我的问题以反映这一点.
正如VonC所指出的那样,使用X.509证书签署Git提交不会增加任何价值.由于Git内置支持,使用GPG密钥是一个更好的选择.
我已经接受了格雷格的回答,因为它与我要求的最接近,即使我原来的问题有点含糊不清.正如Greg指出的那样,如果你能证明你在某个时间点知道提交哈希,那么这可以保证你知道当时哈希所用的存储库内容,并且不需要在存储库中存储任何额外的数据.时间戳数据可以存储在任何地方.
可以使用openssl(v1.0.0 +)并curl为提交哈希请求RFC3161时间戳.
你需要有一些信息:
CONTENT_TYPE="Content-Type: application/timestamp-query"
ACCEPT_TYPE="Accept: application/timestamp-reply"
openssl ts -query -cert -digest "$REV" -sha1 \
| curl -s -H "$CONTENT_TYPE" -H "$ACCEPT_TYPE" --data-binary @- $URL
Run Code Online (Sandbox Code Playgroud)
以上将输出签名的时间戳stdout.如果时间戳服务拒绝请求,它也可能输出错误.
这与请求时间戳非常相似,但您还需要:
时间戳服务应该使用由受信任的颁发机构颁发的证书签署时间戳.如果没有,你的时间戳没有太大的可信度.如果找不到或创建正确的证书链,请尝试使用cacert.pem发布的curl.就在这里.
以下代码段假定正在传递现有的签名时间戳回复stdin.应该可以将上述请求直接传递给下面的verify命令.如果将请求中的响应存储在变量中,则可能需要对其进行base64编码/解码(man base64).
openssl ts -verify -digest "$REV" -in /dev/stdin -CAfile "$CAFILE"
Run Code Online (Sandbox Code Playgroud)
如果您检查回复,您会注意到请求摘要与使用的Git修订版匹配.您可以使用此命令检查答复的纯文本版本. …
我没有看到任何明显的问题,但我想知道是否可以使用/而不是File.separator在我编写构建文件时.使用File.separator使得阅读某些路径非常困难.例如:
dependsDir = "${buildDir}${File.separator}depends"
Run Code Online (Sandbox Code Playgroud)
VS
dependsDir = "${buildDir}/depends"
Run Code Online (Sandbox Code Playgroud) 如果hbox的大小调整大于其首选宽度,则默认情况下它会将子级保持为其首选宽度,从而使额外空间不被使用.如果应用程序希望为一个或多个子项分配该额外空间,则可以选择性地为该子项设置一个hgrow约束.有关详细信息,请参阅"可选布局约束".
在附图中,为什么按钮不能填充水平宽度?

这HBox.setHgrow(field, Priority.ALWAYS)与文档引用的代码不同.
我正在将Apache Shiro添加到我的应用程序中,我想知道以下错误消息是否真的准确:
org.apache.shiro.UnavailableSecurityManagerException:调用代码无法访问的SecurityManager,无论是绑定到org.apache.shiro.util.ThreadContext还是作为vm静态单例.这是一个无效的应用程序配置.
我查看了一下源代码,我得到的印象是,只要我没有使用SecurityUtils并且我愿意传递SecurityManager给需要它的组件,我实际上不需要分配SecurityManager给它使用的静态单例SecurityUtils.
我想避免的具体事情是让Shiro把任何东西放入ThreadLocal或让Shiro使用它的ThreadContext支持类.我正在使用Apache Thrift,并且不想让自己致力于每个请求的单线程网络设计.我对Shiro的要求非常小,所以我将在下面展示我正在做的事情.
我在我的应用程序中使用Guice,但我没有使用,shiro-guice因为Shiro AOP的东西取决于与a Subject相关联ThreadContext.相反,我从一个非常简单的Guice模块开始.
public class ShiroIniModule extends AbstractModule {
@Override
protected void configure() {}
@Provides
@Singleton
public SecurityManager provideSecurityManager() {
return new DefaultSecurityManager(new IniRealm("classpath:shiro.ini"));
}
}
Run Code Online (Sandbox Code Playgroud)
这不是一个生产质量领域/安全管理器设置,但它足以让我测试.接下来,我创建自己的管理器类,其范围非常有限,我的应用程序的组件使用它们.我有两个; a ThriftAuthenticationManager和a ThriftAuthorizationManager.这是前者:
@Singleton
public class ThriftAuthenticationManager {
private final Logger log = LoggerFactory.getLogger(ThriftAuthenticationManager.class);
private final SecurityManager securityManager;
@Inject
public ThriftAuthenticationManager(SecurityManager securityManager) {
this.securityManager = securityManager; …Run Code Online (Sandbox Code Playgroud) 我正在使用JavaFX SceneBuilder,但我会在下面粘贴FXML,因为它很短.我有一个非常简单的窗口,在窗格内有一个分割窗格.这是FXML:
<?xml version="1.0" encoding="UTF-8"?>
<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml">
<children>
<SplitPane id="main-split-pane" dividerPositions="0.25" focusTraversable="true" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="-1.0" prefWidth="-1.0" style="" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" style="" />
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" />
</items>
</SplitPane>
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
<stylesheets>
<URL value="@main-view.css" />
</stylesheets>
</AnchorPane>
Run Code Online (Sandbox Code Playgroud)
我正在使用以下CSS:
#main-split-pane {
-fx-border-style: none;
-fx-border-color: blue;
-fx-border-width: 25;
}
Run Code Online (Sandbox Code Playgroud)
它给了我这样一个窗口:

我已经玩过这里显示的CSS设置,但有一些我无法理解的事情:
-fx-border-style会none导致-fx-border-color …我最近遇到了glassfish standalone(v3.1)vs glassfish embedded(v3.1)vs java SE以及java.endorsed.dirs的使用方式的问题.我遇到的具体问题在这里,但我认为这不是我最后一次遇到类似问题.
我在这里和这里找到的信息建议在编译时将glassfish认可的lib添加到bootstrap类路径.但是,这个错误报告表明,当使用嵌入的glassfish时很难正确设置认可的库.
因此,似乎当我部署到独立的glassfish容器时,我的应用程序将针对glassfish包含的认可库运行,但是当使用嵌入式容器时,它不会.我遇到了我原来的问题,因为maven-embedded-glassfish-plugin没有启动使用像glassfish独立的认可库这样嵌入的glassfish.我也不确定其他容器(例如:jboss)是否包含与glassfish相同的一组认可库.
所以,我(1)应该努力(很多)确保我的应用程序是针对认可的lib编译的,并且总是部署到使用已认可的libs引导的容器中,或者我应该坚持使用捆绑的内容使用Java SE 6?
如果我选择(2),在将应用程序部署到使用较新的背书库进行自举的容器时,是否需要担心不兼容问题?
我很感激任何人都能提供的见解.
我本地Nexus存储库中的一些工件没有正确的校验和.例如(错误的校验和):
cat central/org/codehaus/plexus/plexus-compiler-api/1.8/plexus-compiler-api-1.8.pom.sha1 95f3332c2bbace129da501424f297e47dd0e976b
vs(正确的校验和):
sha1sum central/org/codehaus/plexus/plexus-compiler-api/1.8/plexus-compiler-api-1.8.pom 4c2947f7e2d09b6e13da34292d897c564f1f9828
看起来我的存储库中有一些工件在此错误处于活动状态时已下载.
Maven Central现在有正确的校验和(4c29 ...),但我本地Nexus存储库中的校验和仍然过时.我不知道如何让我的本地存储库验证和/或从中央重新下载正确的校验和.
修复本地存储库的正确方法是什么.这个问题并没有太多的工件,所以我认为我可以(手动)验证它们仍然存在于中央并从我的本地存储库中删除它们.应该使用正确的校验和重新缓存它们.有没有更好的办法?
更新:
我更多地看了这个,我几乎是肯定的,我知道我的问题的根源是什么.我遇到问题的其中一件工件就是这个(plexus-compiler-api:1.8):
在我的存储库中,.pom和.pom.sha1都被加上时间戳为2010年3月29日.在中央,.pom的时间戳为2010年3月29日,而.pom.sha1的时间戳为2010年4月21日.我正在阅读关于Nexus维护的内容.我假设,在2010年4月21日,Maven Central重建了元数据并验证了校验和,这些校验和修复了plexus-compiler-api:1.8工件的错误.sha1.
根据上面的Sonatype链接,我应该能够使Maven Central的缓存过期,并让我的本地安装使用比最初缓存的工件更新的时间戳来提取新副本.但是,基于我观察到的行为,我认为它只检查工件文件的时间戳,而不是校验和文件.
就我当地的Nexus存储库而言,我拥有该工件的最新版本(2010年3月29日),因此无需重新下载任何内容.
我注意到我的Nexus版本已经很老了(1.5 vs 1.9.1),所以我会尝试更新,看看新版本是否能更好地过期缓存.如果没有,我可能会看到Sonatype的想法(也许这是一个错误?).
我不明白为什么这会混淆编译器.我正在使用泛型类型T来保存put与get方法无关的对象.我一直认为GenericClass并且GenericClass<Object>功能相同,但我必须弄错.在编译DoesntWork课程时,我得到了incompatible types - required: String - found: Object.该Works班做什么,我的期望.这里发生了什么?
public class GenericClass<T> {
public <V> void put(Class<V> key, V value) {
// put into map
}
public <V> V get(Class<V> key) {
// get from map
return null;
}
public static class DoesntWork {
public DoesntWork() {
GenericClass genericClass = new GenericClass();
String s = genericClass.get(String.class);
}
}
public static class Works {
public Works() …Run Code Online (Sandbox Code Playgroud) 我认为简短的回答可能不是,但我希望我能得到其他建议.假设我有一个数据对象和一个数据服务.数据服务是一个接口,具有以下方法.
public Data getData();
Run Code Online (Sandbox Code Playgroud)
我正在使用以下调用处理程序和Netty为服务创建代理,以执行我称之为异步rpc的操作.代理服务器位于客户端.
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// Convert the call into an async request that returns a ListenableFuture
APCRequest request = new APCRequest(serviceType, method, args);
ListenableFuture future = apcClient.asyncMessage(request);
// This blocks until the future finishes
return future.get();
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,如果我的客户端是UI,我最终将服务调用包装在SwingWorker之类的东西中.我宁愿想出一种方法来返回我已经坐在那里的ListenableFuture.有没有办法在不创建单独的异步服务API的情况下实现这一目标.例如:
public ListenableFuture<Data> getData();
Run Code Online (Sandbox Code Playgroud)
如果我可以让我的InvocationHandler返回错误的类型,我可以使用这样的东西.
public abstract class AsyncServiceCall<S, D> { // S = service type, D = expected doCall return type
protected final S service;
protected AsyncServiceCall(Class<S> serviceType, APCClient …Run Code Online (Sandbox Code Playgroud) 编辑:我已经针对此问题提交了错误报告.事实证明我不小心对b118运行了这个例子,而不是b120.这个错误在b118和b120之间的某个时间被修复了,所有东西都按照我预期的那样使用b120.
我正在使用JavaFX 8(构建OpenJDK的120)并且我在使用TableView滚动时遇到问题.这是一个SSCCE:
import javafx.application.Application;
import javafx.beans.binding.IntegerBinding;
import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class TableViewScroll extends Application {
private final ObservableList<Person> personList = FXCollections.observableArrayList();
private final FilteredList<Person> filteredPersonList = new FilteredList<>(personList);
private final StringProperty filterText = new SimpleStringProperty();
private final IntegerProperty count = new SimpleIntegerProperty();
public static void main(String[] args) { …Run Code Online (Sandbox Code Playgroud)