我最近写了一个小应用程序,定期检查目录的内容.过了一会儿,应用程序因为打开文件句柄太多而崩溃.经过一些调试,我发现以下行中的错误:
Files.list(Paths.get(destination)).forEach(path -> {
// To stuff
});
Run Code Online (Sandbox Code Playgroud)
然后我检查了javadoc(我可能应该早点完成)Files.list并找到:
* <p> The returned stream encapsulates a {@link DirectoryStream}.
* If timely disposal of file system resources is required, the
* {@code try}-with-resources construct should be used to ensure that the
* stream's {@link Stream#close close} method is invoked after the stream
* operations are completed
Run Code Online (Sandbox Code Playgroud)
对我来说,"及时处理"仍然听起来资源将最终在应用程序退出之前发布.我查看了JDK(1.8.60)代码,但是我无法找到任何关于通过Files.list再次发布打开的文件句柄的提示.
然后我创建了一个小应用程序,在使用后显式调用垃圾收集器Files.list:
while (true) {
Files.list(Paths.get("/")).forEach(path -> {
System.out.println(path);
});
Thread.sleep(5000);
System.gc();
System.runFinalization();
}
Run Code Online (Sandbox Code Playgroud)
当我检查打开的文件句柄时,lsof -p <pid>我仍然可以看到"/"的打开文件句柄列表变得越来越长. …
我刚刚开始看看Java 9模块系统,我想知道一个类是否有可能知道它所在的模块.
为此我创建了以下模块
module de.test {
exports de.test.myexport;
}
Run Code Online (Sandbox Code Playgroud)
并编译了一个看起来像的jar文件
> jar --print-module-descriptor --file=Java9Test-1.0-SNAPSHOT.jar
de.test
requires mandated java.base
exports de.test.myexport
Run Code Online (Sandbox Code Playgroud)
在包中de.test,我有一个叫做Overview调用的类
Module module = Overview.class.getModule();
Run Code Online (Sandbox Code Playgroud)
但是,返回的模块对象是未命名的,没有ModuleDescriptor.
我getModule()在这里使用正确,还是有其他方法加载类的模块?
我在OS X上使用JDK 9 build 120.
我剪了这个简单的 kotlin 片段,尝试将列表元素映射到字符串,如下所示:
sealed class MySealedClass
class MyClass1 : MySealedClass()
class MyClass2 : MySealedClass()
fun doTheMapThing(elements: List<MySealedClass>): List<String> {
return elements.flatMap {
when (it) {
is MyClass1 -> listOf("Yeah")
is MyClass2 -> null
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 中flatMap,when要么映射到列表,要么映射到null,因此 的有效返回类型when是List<String>?。我有点惊讶地看到这个编译没有任何问题。kotlin 编译器不应该对此发出警告吗?当我将 提取when到函数中时,我收到了正确的编译器错误。我在这里遗漏了一些东西还是这可能是一个错误?
使用科特林 1.5.31
我正在使用Jenkins DSL插件自动为git项目的所有分支创建构建作业.DSL插件由Web挂钩触发,以便在创建新分支后立即运行.每个分支的生成的构建作业也配置为由Web挂钩触发.
当前设置的问题是,构建只会在第二次提交后执行.第一次提交将触发Jenkins DSL插件创建相应的Jenkins Job,然后第二次提交将触发新创建的作业.
有没有办法,在DSL插件创建Jenkins工作后立即开始工作?我目前唯一可以提出的是添加额外的构建调度,但我更喜欢使用Web钩子来防止不必要的轮询.
我创建了两个小项目de.app1和de.app2,其中App从de.app1使用Test从de.app2.
??? de.app1
? ??? de
? ? ??? app
? ? ??? App.java
? ??? module-info.java
??? de.app2
??? de
??? test
??? Test.java
Run Code Online (Sandbox Code Playgroud)
第一个项目中的module-info.java只包含module de.app1 {}
我编译了第二个项目并创建了一个jar文件:
javac de/test/Test.java
jar cf app2.jar de/test/Test.class
Run Code Online (Sandbox Code Playgroud)
然后尝试编译第一个项目,如下所示:
javac -cp ../de.app2/app2.jar de/app/App.java module-info.java
Run Code Online (Sandbox Code Playgroud)
失败,因为Test无法找到.当我在没有module-info.java的情况下编译项目时,一切正常.
是否有可能在Java 9模块中使用不是Java 9模块的jar中的类?特别是对于依赖第三方项目的项目(例如apache-commons,......),我认为需要这样的东西.
我JMOD用这样的jmod工具创建了一个简单的文件
$JAVA_HOME/bin/jmod create --class-path classes test/samples.jmod
Run Code Online (Sandbox Code Playgroud)
接下来,我尝试通过运行以下命令在该模块中执行一个类:
java -mp test -m de.mypackage/de.mypackage.Test
Run Code Online (Sandbox Code Playgroud)
这导致以下异常:
Error occurred during initialization of VM
java.lang.module.ResolutionException: JMOD files not supported: test/samples.jmod
at java.lang.module.Resolver.findWithBeforeFinder(java.base@9-ea/Resolver.java:729)
at java.lang.module.Resolver.resolveRequires(java.base@9-ea/Resolver.java:86)
at java.lang.module.Configuration.resolveRequiresAndUses(java.base@9-ea/Configuration.java:370)
at java.lang.module.ModuleDescriptor$1.resolveRequiresAndUses(java.base@9-ea/ModuleDescriptor.java:1986)
at jdk.internal.module.ModuleBootstrap.boot(java.base@9-ea/ModuleBootstrap.java:263)
at java.lang.System.initPhase2(java.base@9-ea/System.java:1928)
Run Code Online (Sandbox Code Playgroud)
如果我只是将我的classes目录(我用来创建JMOD文件)设置为模块路径,那么一切都按预期工作.
通常不可能JMOD在模块路径上有文件吗?如果是这种情况,有什么理由吗?
我从另一个类获取EventHandler,我想将此EventHandler和其他ActionEvent设置为相同的按钮.有可能的?
代码如下.按钮是:"btnAdd".
public void addActionListener(EventHandler<ActionEvent> eventHandlerSetNotSave){
btnAdd.setOnAction((e)-> {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open Resource File");
FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("pictures file format",
"*.TIF","*.JPG","*.PNG","*.GIF","*.JEPG");
fileChooser.getExtensionFilters().addAll(extFilter);
File file = fileChooser.showOpenDialog(null);
if (file != null &&
url.equals(emptyImageUrl)? true:alertMessageWarning("The viseme will change, and previous viseme will be delete.")) {
setImage("file:"+file.toString());
changeAfterSaved=false;
}
});
btnAdd.setOnAction(eventHandlerSetNotSave);
btnDelete.setOnAction((e)-> {
changeAfterSaved=true;
setImage(emptyImageUrl);
});
}
Run Code Online (Sandbox Code Playgroud) 我正在用 Spring Security 编写一个 Spring Boot 应用程序,它有一个 REST API 和一个 Web 界面。当用户未通过身份验证时,REST API 应返回,401 Unauthorized而 Web 界面应重定向到登录页面。使用下面的配置,这在以下情况下有效:
如果请求包含授权标头但没有 bearer令牌,我无法做到的是具有相同的行为。在这种情况下,请求总是被重定向到登录页面,无论是 API 请求还是“网络”请求。到目前为止,我发现的唯一防止这种情况的选择是设置bearer-only为 true,但随后不会再将请求重定向到登录页面...
我可以尝试其他任何配置吗?谢谢!
@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = [KeycloakSecurityComponents::class])
open class SecurityConfiguration : KeycloakWebSecurityConfigurerAdapter() {
@Autowired
fun configureGlobal(auth: AuthenticationManagerBuilder) {
auth.authenticationProvider(keycloakAuthenticationProvider())
}
@Bean
open fun keycloakConfigResolver(): KeycloakSpringBootConfigResolver {
return KeycloakSpringBootConfigResolver()
}
@Bean
override fun sessionAuthenticationStrategy(): SessionAuthenticationStrategy {
return RegisterSessionAuthenticationStrategy(SessionRegistryImpl())
}
override fun authenticationEntryPoint(): AuthenticationEntryPoint? {
val requestMatcher = NegatedRequestMatcher(
OrRequestMatcher(
WEBAPP_ANT_PATHS.map {
AntPathRequestMatcher(it) …Run Code Online (Sandbox Code Playgroud)