A. java開發工具中的代碼管理工具有那些
Code Review中文應該譯作「代碼審查」或是「代碼評審」,這是一個流程,當開發人員寫好代碼後,需要讓別人來review一下他的代碼,這是一種有效發現BUG的方法。由此,我們可以審查代碼的風格、邏輯、思路……,找出問題,以及改進代碼。因為這是代碼剛剛出爐的時候,所以,這也是代碼重構,代碼調整,代碼修改的最佳時候。所以,Code Review是編碼實現中最最重要的一個環節。長時間以來,Code Review需要有一些有效的工具來支持,這樣我們就可以更容易,更有效率地來進行代碼審查工作。下面是5個開源的代碼審查工具,他們可以幫助你更容易地進行這項活動。1. Review board: Review board 是一個 基於web 的工具,主要設計給 django 和python的用戶。 Review board 可以幫助我們追蹤待決代碼的改動,並可以讓Code-Review更為容易和簡練。盡管Review board 最初被設計在VMware項目中使用,但現在其足夠地通用。當前,其支持這些代碼版本管理軟體: SVN, CVS, Perforce, Git, Bazaar, 和Mercurial.Yahoo 是review-board的其中一個用戶。「Review board 已經改變了代碼評審的方式,其可以強迫高質量的代碼標准和風格,並可以成為程序員編程的指導者。每一次,當你訪問search.yahoo.com 時,其代碼都是使用 Review board工具Review過的。 We』re great fans of your work!」– Yahoo! Web Search 2. Codestriker: Codestriker 也是一個基於Web的應用,其主要使用 GCI-Perl 腳本支持在線的代碼審查。Codestriker 可以集成於CVS, Subversion, ClearCase, Perforce 和Visual SourceSafe。並有一些插件可以提供支持其它的源碼管理工具。David Sitsky 是 Codestriker 的作者,並也是最活躍的開發人員之一。 Jason Remillard 是另一個活路的開發者,並給這個項目提供了最深遠最有意義的貢獻。大量的程序員貢獻他們的代碼給 Codestriker 項目,導致了這個項目空前的繁榮。 3. Groogle: Groogle 是一個基於WEB的代碼評審工具。 Groogle 支持和 Subversion 集成。它主要提供如下的功能:各式各樣語言的語法高亮。 支持整個版本樹的比較。 支持當個文件不同版本的diff功能,並有一個圖形的版本樹。 郵件通知所有的Reivew的人當前的狀態。 認證機制。 4. Rietveld: Rietveld 由Guido van Rossum 開發(他是Python的創造者,現在是Google的員工),這個工具是基於Mondrian 工具,作者一開始是為了Google 開發的,並且,它在很多方面和Review board 很像。它也是一個基於Web的應用,並可以Google App Engine 當主機。它使用了目前最流行的Web開發框架 django 並支持 Subversion 。當前,任何一個使用 Google Code 的項目都可以使用 Rietveld 並且使用 python Subversion 伺服器。當然,它同樣支持其它的Subversion伺服器。 5. JCR JCR 或者叫做 JCodeReview 也是一個基於WEB界面的最初設計給Reivew Java 語言的一個工具。當然,現在,它可以被用於其它的非Java的代碼。JCR 主要想協助:審查者。所有的代碼更改都會被高亮,以及大多數語言的語法高亮。Code extracts 可以顯示代碼評審意見。如果你正在Review Java的代碼,你可以點擊代碼中的類名來查看相關的類的聲明。 項目所有者。可以 輕松創建並配置需要Review的項目,並不需要集成任何的軟體配置管理系統(SCM)。 流程信仰者。 所有的評語都會被記錄在資料庫中,並且會有狀態報告,以及各種各樣的統計。 架構師和開發者。 這個系統也可以讓我們查看屬於單個文件的評語,這樣有利於我們重構代碼。
B. 鎬!鎬!鎬!鎬!鎬! 鍦ㄤ竴涓鏂囦歡澶圭洰褰曚笅 濡傛灉鏄.java鏂囦歡灝卞垎鏋愬嚭鏈夋晥浠g爜琛屾暟銆佺┖琛屾暟銆佹敞閲婅屾暟銆傛帴涓嬮潰
鎴戜滑浠ュ墠鍦ㄥ︽牎鐨勬椂鍊欎篃鍋氳繃榪欎釜錛岃繕瑕佺敤Swing鍋氱晫闈銆備笉榪囦粖澶╂槸鎴戜粠鏂板仛鍑烘潵鐨
JavaSourceUtil.java
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.util.ArrayList;
importjava.util.List;
classJavaSourceUtil{
publicstaticvoidmain(String[]args){
//緇熻℃枃浠惰礬寰
StringfolderPath="C:\Users\xmi\Desktop\AnzDoc\123\BatchAssistant\src\dcb\";
//璺寰勬枃浠
Filefolder=newFile(folderPath);
//婧愭枃浠剁粺璁″伐鍏
JavaSourceUtilutil=newJavaSourceUtil();
//鏍規嵁璺寰勫緱鍒扮粺璁$粨鏋滃垪琛
List<SourceBean>cntList=util.countJavaSource(folder);
//鏍規嵁緇熻¤屾暟璁$畻娉ㄩ噴鐜囥佺┖琛岀巼銆佹湁鏁堜唬鐮佺巼鐨勭粨鏋
StringBufferresultSbuf=util.outputCountResult(cntList);
//杈撳嚭緇熻$粨鏋
System.out.println(resultSbuf.toString());
//淇濆瓨緇撴灉鍒版枃浠
util.saveFile(resultSbuf,"D:\java_source_cnt.txt");
}
(List<SourceBean>listBean){
StringBuffersbuf=newStringBuffer();
SourceBeantotalCntBean=newSourceBean("鍏ㄩ儴鏂囦歡緇熻");
for(SourceBeanbean:listBean){
inttolCnt=bean.getTotalLine();
if(tolCnt==0){
continue;
}
//娉ㄩ噴鐜囥佺┖琛岀巼銆佹湁鏁堜唬鐮佺巼鐨勭粨鏋滅畻鍑烘潵
sbuf.append(bean.fileName+"浠g爜緇熻★細").append(" ");
sbuf.append("絀鴻岀巼錛").append(bean.blankLine*1.0/tolCnt)
.append(" ");
sbuf.append("娉ㄩ噴鐜囷細")
.append((bean.singlgCmtLine+bean.multCmtLine)*1.0
/tolCnt).append(" ");
sbuf.append("鏈夋晥浠g爜鐜囷細").append(bean.codeLine*1.0/tolCnt)
.append(" ");
totalCntBean.blankLine+=bean.blankLine;
totalCntBean.codeLine+=bean.codeLine;
totalCntBean.documtLine+=bean.documtLine;
totalCntBean.multCmtLine+=bean.multCmtLine;
totalCntBean.singlgCmtLine+=bean.singlgCmtLine;
}
sbuf.append(totalCntBean.fileName+"浠g爜緇熻★細").append(" ");
sbuf.append("鎬葷┖琛岀巼錛").append(totalCntBean.blankLine*1.0/totalCntBean.getTotalLine())
.append(" ");
sbuf.append("鎬繪敞閲婄巼錛")
.append((totalCntBean.singlgCmtLine+totalCntBean.multCmtLine)*1.0
/totalCntBean.getTotalLine()).append(" ");
sbuf.append("鎬繪湁鏁堜唬鐮佺巼錛").append(totalCntBean.codeLine*1.0/totalCntBean.getTotalLine())
.append(" ");
returnsbuf;
}
/**
*Java浠g爜緇熻
*@paramfolder鍩烘湰璺寰
*@return緇熻$粨鏋
*/
publicList<SourceBean>countJavaSource(Filefolder){
List<SourceBean>cntList=newArrayList<SourceBean>();
if(!folder.exists()||!folder.isDirectory()){
returncntList;
}
File[]files=folder.listFiles();
for(inti=0;i<files.length;i++){
if(files[i].isDirectory()){
cntList.addAll(countJavaSource(folder));
}else{
SourceBeancntBean=countCodeLine(files[i]);
if(cntBean!=null){
cntList.add(cntBean);
}
}
}
returncntList;
}
/**
*鍗曚釜鏂囦歡浠g爜緇熻
*@paramjavaFile.java鏂囦歡
*@return緇熻$粨鏋
*/
publicSourceBeancountCodeLine(FilejavaFile){
if(!javaFile.exists()||!javaFile.isFile()||!javaFile.getName().endsWith(".java")){
returnnull;
}
SourceBeancntBean=newSourceBean(javaFile.getAbsolutePath());
//浠g爜鐘舵
intstatus=0;
try{
InputStreamReaderisr=newInputStreamReader(newFileInputStream(javaFile));
Stringstr="";
BufferedReaderbufReader=newBufferedReader(isr);
while((str=bufReader.readLine())!=null){
str=str.trim();
if(str.startsWith("/**")){
//鏂囨。娉ㄩ噴
status=10;
}elseif(str.startsWith("/*")){
//澶氳屾敞閲
status=20;
}
if(isEmpty(str)){
//絀虹櫧鑸
cntBean.blankLine++;
}elseif(status==10){
//鏂囨。娉ㄩ噴
cntBean.documtLine++;
}elseif(status==20){
//澶氳屾敞閲
cntBean.multCmtLine++;
}elseif(str.startsWith("//")){
//鍗曡屾敞閲
cntBean.singlgCmtLine++;
}else{
//浠g爜琛
cntBean.codeLine++;
}
if(str.endsWith("*/")){
//鍗曡屾垨鏂囨湰娉ㄩ噴緇撴潫
status=0;
}
}
bufReader.close();
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returncntBean;
}
/**
*絀鴻屽垽鏂
*@paramstrValue
*@return鏄鍚︿負絀鴻
*/
publicbooleanisEmpty(StringstrValue){
if(strValue==null||strValue.trim().equals("")){
returntrue;
}
returnfalse;
}
/**
*璇誨彇鏂囨湰鏂囦歡
*@parampath
*@return
*/
publicvoidsaveFile(StringBufferbuilder,Stringpath){
try{
FileOutputStreamfos=newFileOutputStream(path);
fos.write(builder.toString().getBytes("utf-8"));
fos.flush();
fos.close();
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
SourceBean.java
publicclassSourceBean{
//絀虹櫧琛
publicintblankLine;
//鍗曡屾敞閲
publicintsinglgCmtLine;
//澶氳屾敞閲
publicintmultCmtLine;
//浠g爜琛屾暟
publicintcodeLine;
//鏂囨尅娉ㄩ噴
publicintdocumtLine;
//鏂囦歡鍚
publicStringfileName;
publicSourceBean(StringfileName){
this.fileName=fileName;
}
publicintgetTotalLine(){
inttotalLine=blankLine+singlgCmtLine+multCmtLine+codeLine
+documtLine;
returntotalLine;
}
}
鏄涓嶆槸寰堢畝鍗曪紒
C. 求推薦一款性價比高的JAVA報表工具
潤乾報表:
1、簡單行列報表、中國式復雜報表,報表工具都能輕松實現。
2、創新的流式大報表,秒級的呈現速度,極少的內存佔用,流暢的Excel導出和直接列印!而且,流式大報表不依賴於資料庫的分頁能力。
3、支持數據錄入。數據錄入可以做到來去無關,來去自由。網頁上錄入可以做到數據合法性校驗和自動計算。結合集算器,可以做到任意數據源的錄入。
4、類似Excel的填報設計器,業務人員完成設計後上傳伺服器,填寫人員即可網上填寫!收集上來的數據,業務人員還可以在潤乾BI中自助分析!
5、大屏展示、炫酷的統計圖、方便的手機統計圖表,都能實現。
支持HTML5和SVG圖形格式,具備豐富的表現力,能夠設計出超酷的統計圖形。同時,可以降低傳輸流量,更適合移動設備。
集成免費的網路echarts、D3、chart.js,有更多炫酷統計圖可供選擇。
6、提供整套報表平台。從用戶管理到許可權登錄,只要配置一下就可以直接上線使用。更重要的是,報表中心完全開源,想怎麼改就怎麼改。
7、提供強大的自助報表功能,輕松實現用戶拖拽報表。自定義報表的數據源可以是SQL,也可以是文本、JSON或者Excel文件。提供的自助報表,可以作為一個插件集成到應用系統中,成為應用系統的一部分,還可以深度定製,充分滿足不同用戶的個性化需求。
D. 對日java項目開發來說,一個月平均能編寫多少行代碼,正常來說的標準是多少行代碼
在日本早期的軟體開發管理中,的確有按照代碼行數來算開發成本的,但是,隨著目標指向語言流行和軟體開發管理的進步,這種方法已經很少見了。
而且,現在很流行開發工具自動化,很多代碼都是自動生成的,很難計算一個月能寫多少代碼。
如果非要數字,平均一個月寫3到10萬行應該是不成問題的。
有一種叫做StepCounter的工具可以計算java代碼行數,lz可以看一下。
E. Java 有什麼好的代碼行數,注釋行數統計工具
package com.syl.demo.test;
import java.io.*;
/**
* java代碼行數統計工具類
* Created by 孫義朗 on 2017/11/17 0017.
*/
public class CountCodeLineUtil {
private static int normalLines = 0; //有效程序行數
private static int whiteLines = 0; //空白行數
private static int commentLines = 0; //注釋行數
public static void countCodeLine(File file) {
System.out.println("代碼行數統計:" + file.getAbsolutePath());
if (file.exists()) {
try {
scanFile(file);
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("文件不存在!");
System.exit(0);
}
System.out.println(file.getAbsolutePath() + " ,java文件統計:" +
"總有效代碼行數: " + normalLines +
" ,總空白行數:" + whiteLines +
" ,總注釋行數:" + commentLines +
" ,總行數:" + (normalLines + whiteLines + commentLines));
}
private static void scanFile(File file) throws IOException {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
scanFile(files[i]);
}
}
if (file.isFile()) {
if (file.getName().endsWith(".java")) {
count(file);
}
}
}
private static void count(File file) {
BufferedReader br = null;
// 判斷此行是否為注釋行
boolean comment = false;
int temp_whiteLines = 0;
int temp_commentLines = 0;
int temp_normalLines = 0;
try {
br = new BufferedReader(new FileReader(file));
String line = "";
while ((line = br.readLine()) != null) {
line = line.trim();
if (line.matches("^[//s&&[^//n]]*$")) {
// 空行
whiteLines++;
temp_whiteLines++;
} else if (line.startsWith("/*") && !line.endsWith("*/")) {
// 判斷此行為"/*"開頭的注釋行
commentLines++;
comment = true;
} else if (comment == true && !line.endsWith("*/")) {
// 為多行注釋中的一行(不是開頭和結尾)
commentLines++;
temp_commentLines++;
} else if (comment == true && line.endsWith("*/")) {
// 為多行注釋的結束行
commentLines++;
temp_commentLines++;
comment = false;
} else if (line.startsWith("//")) {
// 單行注釋行
commentLines++;
temp_commentLines++;
} else {
// 正常代碼行
normalLines++;
temp_normalLines++;
}
}
System.out.println(file.getName() +
" ,有效行數" + temp_normalLines +
" ,空白行數" + temp_whiteLines +
" ,注釋行數" + temp_commentLines +
" ,總行數" + (temp_normalLines + temp_whiteLines + temp_commentLines));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
br = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//測試
public static void main(String[] args) {
File file = new File("F:\\myweb");
countCodeLine(file);
}
}
F. 你常用的Java工具庫都有哪些
JavaSDK肯定是使用最廣的庫,所以本文的名單焦點是流行的第三方庫。該列表可能並不完善,所以如果你覺得有什麼應該出現在列表中的,請留下您的評論。非常感謝!
1、核心庫
Apache Commons Lang:來自Apache的核心庫,為java.lang API補充了許多常用的工具類,如字元串操作、對象的創建等。
Google Guava:來自谷歌的核心庫,包括集合(Collection)、緩存(Caching)、支持原語(Primitives)等。(示例)
2、HTML、XML Parser
Jsoup:一個簡化了的 HTML操作的庫。(示例)
STaX:一組可以高效處理XML的API。 (示例)
3、Web框架
Spring:Java平台上眾所周知的開源框架和依賴注入容器。(示例)
Struts2:來自Apache的流行Web框架。 (示例)
GoogleWebToolkit:Google提供的開發工具庫,主要用於構建和優化復雜的Web程序用。 (示例)
Strips:使用最新Java技術構建的Web程序框架,推薦使用。
Tapestry:面向組件的框架,用於使用Java創建動態、健壯、擴展性高的Web應用程序。
請猛擊這里查看以上面框架之間的比較。
4、圖表、報表、圖像
JFreeChart:用於創建如條形圖、折線圖、餅圖等圖表。
JFreeReport:創建於輸出PDF格式的報表。
JGraphT:創建圖像,其中只包含由線段連接的點集。
5、窗口
Swing:SDK提供的GUI庫。(示例)
SWT:eclipse提供的GUI庫。
SWT與Swing的比較。
6.、GUI框架
EclipseRCP。(示例)
7、自然語言處理
OpenNLP:來自Apache的自然語言處理庫。 (示例)
StanfordParser:斯坦福大學提供的自然語言處理庫。(示例)
如果你是一名NLP專家,請猛擊這里查看更多工具庫介紹。
8、靜態分析
EclipseJDT:由IBM提供的靜態分析庫,可以操作Java源代碼。(示例)
WALA:可以處理jar包文件(即位元組碼)的工具庫。(示例)
9、JSON
Jackson: 用於處理JSON數據格式的多用途的Java庫。Jackson 旨在快速、准確、輕量、對開人員友好之間找到最好的平衡點。
XStream:一個簡單用於對象和XML互相轉換的庫。
GoogleGson:一個專門用於Java對象和Json對象相互轉換的工具庫。(示例)
JSON-lib:用於beans、maps、collections、javaarrays、XML和JSON之間相互轉換操作的工具庫。
10、數學
ApacheCommonsMath:提供數學計算和數值統計需函數的工具庫。
11、日誌
ApacheLog4j:風行一時的日誌記錄操作庫。(示例)
Logback:當前流行的log4j項目的繼任者。
SLF4J(TheSimpleLoggingFacadeforJava): 各種日誌框架的一個簡單的外觀或抽象(如java.util.logging 、logback、log4j等),允許用戶在部署時加入需要的日誌框架。
12、Office
ApachePOI:利用其提供的APIs,可以使用純Java代碼操作各種基於微軟OLE2合成文檔格式的文檔。
Docx4j:一個用於創建、操作微軟公開的XML文件的庫(支持Worddocx、 Powerpointpptx和Excelxlsx)。
13、日期和時間
Joda-Time:如有質量問題包退包換的Java日期和時間類。
14、資料庫
Hibernate、EclipseLink、JPA
JDO
jOOQ
SpringJDBC、SpringData
ApacheDbUtils
15、開發工具
Lambok: 旨在減少代碼編寫的Java開發庫。