小编Jos*_*rdt的帖子

liquibase 3.5.X找不到包含相对路径的includeAll的任何文件

我们正在使用liquibase 3.4.2并希望更新到3.5.3但我的所有尝试都失败了,因为liquibase找不到usind包含的任何文件includeAll.我有测试liquibase 3.5.0,3.5.1和3.5.3(由于这篇博文,我跳过了3.5.2 ).

我的ChangeSet看起来像这样:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
               xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">

    <includeAll path="relative/dir1" relativeToChangelogFile="true" errorIfMissingOrEmpty="true"/>
    <includeAll path="relative/dir2" relativeToChangelogFile="true" errorIfMissingOrEmpty="true"/>

</databaseChangeLog>
Run Code Online (Sandbox Code Playgroud)

我的目录结构(在战争中包含的jar内)如下所示:

  • /some/dir/changeset.xml (上面的代码)
  • /some/dir/relative/dir1/another-changeset.xml
  • /some/dir/relative/dir2/another-changeset-1.xml
  • /some/dir/relative/dir2/another-changeset-2.xml

我已经通过liquibase进行了调试并且被困在ClassLoaderResourceAccessor.java:108:

if (entry.getName().startsWith(path)) {
Run Code Online (Sandbox Code Playgroud)

在我的情况下,在第一个循环中entry.getName()返回some,然后some/dir依此类推,直到some/dir/relative/dir1/another-changeset-1.xml,some/dir/relative/dir2/another-changeset-1.xmlsome/dir/relative/dir2/another-changeset-2.xml.但条件始终是假的,因为path包含有类似jar:file:/C:/path/to/maven/project/war/target/example.war-1.0-SNAPSHOT/WEB-INF/lib/changesets-1.0-SNAPSHOT.jar!/relative/dir1/jar:file:/C:/path/to/maven/project/war/target/example.war-1.0-SNAPSHOT/WEB-INF/lib/changesets-1.0-SNAPSHOT.jar!/relative/dir2/

这真的是liquibase自3.5.0以来的一个错误吗?如果我降级到liquibase 3.4.2,它的效果非常好.如果我使用它include而不是includeAll在我的实际应用程序中,我有更多的变更集,我不想手动列出它们.

我已经找到了一些相关的信息,但没有一个对我有帮助.为了完整起见:

java database liquibase

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

自定义异常错误继承

我创建了扩展Exception类的自定义基本异常.后来我正在扩展MyBaseException又把另一个类 - 这次是specyfic异常类.而我现在对SonarQube之一有一个问题 - 特别是" 类似命名的类"Exception"应该扩展"Exception"或子类 "规则.类声明看起来像这样:

import org.apache.log4j.Logger;
import org.springframework.http.HttpStatus;    
public class MyBaseException extends Exception {
    public MyBaseException(int code, String message) {
        super(message);
        this.code = code;
        LOGGER.error("Exception with HttpStatus code: " + code + " Msg: "
            + message);
    }

    public MyBaseException(HttpStatus code, String message) {
        this(code.value(), message);
    }

    public int getCode() {
        return code;
    } 
}

import org.springframework.http.HttpStatus;
public class SpecException extends MyBaseException {
    public SpecException (HttpStatus code, String message) {
        super(code, message);
    } …
Run Code Online (Sandbox Code Playgroud)

java inheritance exception sonarqube

9
推荐指数
1
解决办法
2126
查看次数

SonarQube假阳性鱿鱼:S1450用于@Getter(lombok)注释字段

我想在使用Project Lombok@Getter注释时发现了误报.

在下面的示例类中,我收到警告"私有字段仅用作方法中的局部变量应该成为局部变量"(squid:S1450).

public class Example {

    @Getter
    private String exampleField; // <-- squid:S1450

    public Example(final String value) {
        setExampleField(value);
    }

    private void setExampleField(final String exampleField) {
        this.exampleField = exampleField;
    }

}
Run Code Online (Sandbox Code Playgroud)

有人能证实吗?它是SonarQube规则中的错误,还是我的班级或我对此规则或@Getter注释的理解有问题?

只是为了完整起见:

  • 项目lombok注释或生成的方法在其他SonarQube规则中被正确识别.所以我认为我的设置很好.
  • 我也尝试将@Getter注释放在类级别上,我也得到了同样的警告.
  • 警告显示在SonarLint(在IntelliJ IDEA中)和SonarQube的Web界面中.所以我认为执行分析仪时并不是错误.
  • 我已经将IntelliJ IDEA中的SonarLint插入到我们的SonarQube服务器中,并且此远程连接正常工作.

我测试了以下版本:

  • SonarQube 6.0
  • SonarQube Java插件4.2
  • SonarLint(适用于IntelliJ IDEA)2.3.2
  • IntelliJ IDEA 2016.2.5
  • Java 8

java lombok sonarqube

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

由于SolrJ,HttpClient,JVM或我的应用程序中的SSL证书无效,Classloader会泄漏?

我在一个大型应用程序中分析了过去几天的类加载器泄漏,并且我已经解决了这个问题.

我的应用程序使用SolrJ,它将通过@Bean-Method 初始化:

@Bean(destroyMethod = "close")
public SolrClient solrClient() {
    return new HttpSolrClient(SOLR_URL);
}
Run Code Online (Sandbox Code Playgroud)

SolrJ(org.apache.solr:solr-solrj:5.4.1)使用Apache HttpClient(org.apache.httpcomponents:httpclient:4.4.1).HttpClient通过使用普通的java类来初始化SSL上下文javax.net.ssl.SSLSocketFactory.通过这种方式,java加载trustManager并分析所有可信证书.如果存在错误,则证书(实例sun.security.x509.X509CertImpl)存储在列表中,并由抛出的异常进行丰富.吞下这个异常,我的应用程序仍然没有意识到.

据我所看到的,SSL上下文是在System /根类加载器,我的应用程序是在专用WebappClassLoader和因为现在有一个这样的问题,IOException它包含在堆栈跟踪,参考文献回溯等等SSL环境内到我的应用程序中的类.

但现在我不知道这是从哪里来的.它是SolrJ客户端,Apache HttpClient,Java本身(JVM)还是我的应用程序?

我做了一个小的应用程序重现,你可以在这里找到问题:https://github.com/CptS/solrj-classloader-leak 这也包含了解决方法(关闭挂钩从而消除导致类加载器泄漏的引用).

如果你禁用了关闭钩子(例如通过注释掉它)并启动一个干净的Tomcat(参见下面的"重现环境"),你可以按照以下步骤重现它:

  1. 部署演示项目的战争(A)
  2. 重装(B)
  3. 重新加载它(C)
  4. 触发GC(D)
  5. 取消部署
  6. 触发GC(E)
  7. 看到元空间没有完全清理(F)

在此输入图像描述

我创建了一个堆转储,GC最短路径如下所示:

在此输入图像描述

这与我的大型应用程序中的相同.所提到的解决方法(一点点启发https://github.com/mjiderhamn/classloader-leak-prevention,但遗憾的是没有解决我的问题)通过使用反射针对这些搜索unparseableExtensions并删除存储在例外why通过现场这样: SSLContextImpl.DefaultSSLContext#defaultImpl- > SSLContextImpl#trustManager- > X509TrustManager#trustedCerts- > X509CertImpl#info- > X509CertInfo#extensions- > CertificateExtensions#unparseableExtensions- >UnparseableExtension#why

通过这样做,我得到了异常的堆栈跟踪,如果它可以帮助某人:

java.io.IOException: No data …
Run Code Online (Sandbox Code Playgroud)

java ssl solr memory-leaks apache-httpclient-4.x

6
推荐指数
1
解决办法
728
查看次数

SonarQube建议使用!== a而不是=== NaN

有一个SonarQube JavaScript规则(javascript:S2688),它说使用a === NaN是一个bug,因为它总是如此false.

我同意这一点,但我认为使用它a !== a(这是由SonarQube建议)是一个非常糟糕的主意.这是一个有趣的JavaScript事实,但肯定不是"最佳实践".

怎么样Number.isNaN(a)?为什么这不是建议的解决方案?我错过了哪些差异或问题?

javascript nan sonarqube

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