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开发库。