統計代碼行數是項目評估、工作量核算、代碼審查的常規需求。本文介紹 Eclipse 內置搜索法、外掛工具法、命令行腳本法三種方案,並提供可直接用於 CI/CD 的跨平台統計腳本。
\n(匹配換行符,即統計物理行數)。*(全部)或 *.java(僅 Java)。注意:此法統計物理行數(含空行、註釋行),非邏輯行數(NCLOC)。結果包含所有匹配文件的換行符總和。
| 插件 | 安裝方式 | 核心指標 | 優勢 |
|---|---|---|---|
| MetricsRelay (開源) | Eclipse Marketplace 搜索安裝 | 行數、圈複雜度、類耦合、繼承深度、方法參數數等 | 免費、輕量、右鍵項目 → Metrics 即可生成 HTML 報告 |
| CodePro Analytix (Google 開源) | Update Site: https://codepro.googlecode.com/svn/update/ |
代碼覆蓋率、靜態分析、重構建議、JUnit 生成 | 功能全面、集成 JUnit/覆蓋率 |
| EclEmma (覆蓋率主打) | Marketplace 安裝 | 行覆蓋率、分支覆蓋率、行數統計 | 可視化覆蓋率高亮、行數統計 |
@echo off
set PROJECT_DIR=%1
if "%PROJECT_DIR%"=="" set PROJECT_DIR=.
echo 統計目錄: %PROJECT_DIR%
findstr /R /C:"." /S "%PROJECT_DIR%\*.java" | find /C /V "" > nul
rem 更精確:wc -l 等效
powershell -Command "Get-ChildItem -Recurse -Filter *.java '%PROJECT_DIR%' | ForEach-Object { (Get-Content $_).Count } | Measure-Object -Sum | Select-Object -ExpandProperty Sum"
#!/bin/bash
# count_loc.sh
PROJECT_DIR=${1:-.}
echo "統計目錄: $PROJECT_DIR"
# 1. 物理行數 (含空行/註釋)
TOTAL_LINES=$(find "$PROJECT_DIR" -name "*.java" -type f -exec wc -l {} + | tail -1 | awk '{print $1}')
echo "Java 物理總行數: $TOTAL_LINES"
# 2. 非空非註釋行數 (NCLOC) - 簡易版
NCLOC=$(find "$PROJECT_DIR" -name "*.java" -type f -exec cat {} + | \
sed '/^\s*$/d' | \
sed '/^\s*\/\//d' | \
sed '/^\s*\/\*/,/\*\//d' | \
wc -l)
echo "Java 非空非註釋行數 (約): $NCLOC"
# 3. 文件數
FILE_COUNT=$(find "$PROJECT_DIR" -name "*.java" -type f | wc -l)
echo "Java 文件數: $FILE_COUNT"
#!/usr/bin/env python3
# count_loc.py
import os
import sys
import argparse
from pathlib import Path
def count_java_loc(root: Path):
total_lines = 0
nc_loc = 0
file_count = 0
in_block_comment = False
for java_file in root.rglob("*.java"):
file_count += 1
try:
content = java_file.read_text(encoding='utf-8', errors='ignore')
except Exception:
continue
lines = content.splitlines()
total_lines += len(lines)
for line in lines:
stripped = line.strip()
# 處理塊註釋 /* ... */
if in_block_comment:
if '*/' in stripped:
in_block_comment = False
continue
if '/*' in stripped:
in_block_comment = True
if '*/' in stripped: # 同行結束
in_block_comment = False
continue
# 跳過空行、單行註釋
if not stripped or stripped.startswith('//'):
continue
nc_loc += 1
return file_count, total_lines, nc_loc
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="統計 Java 代碼行數")
parser.add_argument("path", nargs="?", default=".", help="項目根目錄")
args = parser.parse_args()
root = Path(args.path).resolve()
if not root.exists():
print(f"路徑不存在: {root}", file=sys.stderr)
sys.exit(1)
files, total, nc = count_java_loc(root)
print(f"項目: {root}")
print(f"Java 文件數: {files}")
print(f"物理總行數: {total}")
print(f"非空非註釋行數 (NCLOC): {nc}")
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>maven-changelog-plugin</artifactId>
<version>1.0</version>
</plugin>
<!-- 或使用專門統計插件 -->
<plugin>
<groupId>com.mycila</groupId>
<artifactId>license-maven-plugin</artifactId>
<version>3.0</version>
</plugin>
運行 mvn changelog:file 或配置 maven-project-info-reports-plugin 生成項目報告包含行數統計。
\n,秒級出結果。