小编Jan*_*sen的帖子

当流未明确关闭时,Files.list(Path dir)中的资源泄漏?

我最近写了一个小应用程序,定期检查目录的内容.过了一会儿,应用程序因为打开文件句柄太多而崩溃.经过一些调试,我发现以下行中的错误:

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 stream java-8

22
推荐指数
1
解决办法
5606
查看次数

方法getModule为命名模块中的类返回未命名的模块

我刚刚开始看看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.

java java-9

20
推荐指数
1
解决办法
586
查看次数

Kotlin 编译器不会警告潜在的空指针异常

我剪了这个简单的 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)

在 中flatMapwhen要么映射到列表,要么映射到null,因此 的有效返回类型whenList<String>?。我有点惊讶地看到这个编译没有任何问题。kotlin 编译器不应该对此发出警告吗?当我将 提取when到函数中时,我收到了正确的编译器错误。我在这里遗漏了一些东西还是这可能是一个错误?

使用科特林 1.5.31

kotlin

19
推荐指数
1
解决办法
385
查看次数

在种子工作创建后立即开始jenkins工作

我正在使用Jenkins DSL插件自动为git项目的所有分支创建构建作业.DSL插件由Web挂钩触发,以便在创建新分支后立即运行.每个分支的生成的构建作业也配置为由Web挂钩触发.

当前设置的问题是,构建只会在第二次提交后执行.第一次提交将触发Jenkins DSL插件创建相应的Jenkins Job,然后第二次提交将触发新创建的作业.

有没有办法,在DSL插件创建Jenkins工作后立即开始工作?我目前唯一可以提出的是添加额外的构建调度,但我更喜欢使用Web钩子来防止不必要的轮询.

jenkins jenkins-job-dsl

12
推荐指数
1
解决办法
2599
查看次数

是否可以在Java 9模块中使用不带module-info.class的依赖项

我创建了两个小项目de.app1de.app2,其中Appde.app1使用Testde.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,......),我认为需要这样的东西.

java java-platform-module-system java-9

11
推荐指数
1
解决办法
4193
查看次数

使用Java 9将自定义JMOD添加到模块路径

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在模块路径上有文件吗?如果是这种情况,有什么理由吗?

java java-platform-module-system java-9 module-path

7
推荐指数
1
解决办法
2340
查看次数

JavaFx - 将两个'setOnAction'设置为相同的按钮

我从另一个类获取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)

java action javafx button

3
推荐指数
1
解决办法
8354
查看次数

如果授权标头中缺少不记名令牌,请勿将 API 请求重定向到登录页面

我正在用 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)

spring spring-security keycloak

0
推荐指数
1
解决办法
45
查看次数