我们正在使用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.xml和some/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在我的实际应用程序中,我有更多的变更集,我不想手动列出它们.
我已经找到了一些相关的信息,但没有一个对我有帮助.为了完整起见:
我创建了扩展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) 我想在使用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注释的理解有问题?
只是为了完整起见:
@Getter注释放在类级别上,我也得到了同样的警告.我测试了以下版本:
我在一个大型应用程序中分析了过去几天的类加载器泄漏,并且我已经解决了这个问题.
我的应用程序使用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(参见下面的"重现环境"),你可以按照以下步骤重现它:
我创建了一个堆转储,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) 有一个SonarQube JavaScript规则(javascript:S2688),它说使用a === NaN是一个bug,因为它总是如此false.
我同意这一点,但我认为使用它a !== a(这是由SonarQube建议)是一个非常糟糕的主意.这是一个有趣的JavaScript事实,但肯定不是"最佳实践".
怎么样Number.isNaN(a)?为什么这不是建议的解决方案?我错过了哪些差异或问题?
java ×4
sonarqube ×3
database ×1
exception ×1
inheritance ×1
javascript ×1
liquibase ×1
lombok ×1
memory-leaks ×1
nan ×1
solr ×1
ssl ×1