使用 PMD maven 在 java 代码中检测连接未关闭
Detecting Connection not closed in java code using PMD maven
我正在尝试使用 maven pmd 插件来检测 project.We 中的所有连接泄漏,使用 BaseSqlUtl.close 关闭连接,所以如果我们可以使用 PMD 找到打开连接的人已经使用这个方法关闭了,我们可以检测到连接泄漏。
由于我们使用自定义 类 来关闭连接,因此我创建了一个规则集更改,在下面 ruleset.xml.
中用 ** 突出显示
<?xml version="1.0"?>
<ruleset name="Design"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>
The Design ruleset contains rules that flag suboptimal code implementations. Alternate approaches
are suggested.
</description>
<rule name="CloseResource"
since="1.2.2"
message="Ensure that resources like this {0} object are closed after use"
class="net.sourceforge.pmd.lang.java.rule.design.CloseResourceRule"
externalInfoUrl="http://pmd.sourceforge.net/pmd-5.0.5/rules/java/design.html#CloseResource">
<description>
Ensure that resources (like Connection, Statement, and ResultSet objects) are always closed after use.
</description>
<priority>3</priority>
<properties>
<property name="types" value="Connection,Statement,ResultSet"/>
**<property name="closeTargets" value="closeStatementQuietly,closeResultSetQuietly,commitAndCloseQuietly,rollbackAndCloseQuietly,closeQuietly,sqlUtil.closeQuietly,resetAndCloseQuietly"/>**
</properties>
<example>
<![CDATA[
public class Bar {
public void foo() {
Connection c = pool.getConnection();
try {
// do stuff
} catch (SQLException ex) {
// handle exception
} finally {
// oops, should close the connection using 'close'!
// c.close();
}
}
}
]]>
</example>
</rule>
</ruleset>
现在这对于像 commitAndCloseQuietly() 这样的无参数方法工作正常,但不幸的是对于接受连接作为参数的其他方法,如 "sqlUtil.closeQuietly(connection)",它给出 false警报。
我尝试参考提出的类似问题,但对这种特定情况没有帮助:
Identifying Connection not closed in java code using PMD
PMD 目前不支持使用辅助方法关闭资源。即使可以配置关闭方法,它们都被假定为在资源本身上调用。
如果 PMD 执行多class DFA,这可能会得到解决,目前它没有,并且可能在一段时间内不会(这对其缓存结果的能力有很大影响)。
更好的解决方法是添加支持以指定将资源作为参数的关闭帮助器方法。欢迎在 Github (https://github.com/pmd/pmd) 上创建功能请求;甚至更好,提交 PR。
我正在尝试使用 maven pmd 插件来检测 project.We 中的所有连接泄漏,使用 BaseSqlUtl.close 关闭连接,所以如果我们可以使用 PMD 找到打开连接的人已经使用这个方法关闭了,我们可以检测到连接泄漏。 由于我们使用自定义 类 来关闭连接,因此我创建了一个规则集更改,在下面 ruleset.xml.
中用 ** 突出显示 <?xml version="1.0"?>
<ruleset name="Design"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>
The Design ruleset contains rules that flag suboptimal code implementations. Alternate approaches
are suggested.
</description>
<rule name="CloseResource"
since="1.2.2"
message="Ensure that resources like this {0} object are closed after use"
class="net.sourceforge.pmd.lang.java.rule.design.CloseResourceRule"
externalInfoUrl="http://pmd.sourceforge.net/pmd-5.0.5/rules/java/design.html#CloseResource">
<description>
Ensure that resources (like Connection, Statement, and ResultSet objects) are always closed after use.
</description>
<priority>3</priority>
<properties>
<property name="types" value="Connection,Statement,ResultSet"/>
**<property name="closeTargets" value="closeStatementQuietly,closeResultSetQuietly,commitAndCloseQuietly,rollbackAndCloseQuietly,closeQuietly,sqlUtil.closeQuietly,resetAndCloseQuietly"/>**
</properties>
<example>
<![CDATA[
public class Bar {
public void foo() {
Connection c = pool.getConnection();
try {
// do stuff
} catch (SQLException ex) {
// handle exception
} finally {
// oops, should close the connection using 'close'!
// c.close();
}
}
}
]]>
</example>
</rule>
</ruleset>
现在这对于像 commitAndCloseQuietly() 这样的无参数方法工作正常,但不幸的是对于接受连接作为参数的其他方法,如 "sqlUtil.closeQuietly(connection)",它给出 false警报。
我尝试参考提出的类似问题,但对这种特定情况没有帮助: Identifying Connection not closed in java code using PMD
PMD 目前不支持使用辅助方法关闭资源。即使可以配置关闭方法,它们都被假定为在资源本身上调用。
如果 PMD 执行多class DFA,这可能会得到解决,目前它没有,并且可能在一段时间内不会(这对其缓存结果的能力有很大影响)。
更好的解决方法是添加支持以指定将资源作为参数的关闭帮助器方法。欢迎在 Github (https://github.com/pmd/pmd) 上创建功能请求;甚至更好,提交 PR。