Gvim编译包内的java文件出现错误

软件和网站开发以及相关技术探讨
回复
头像
ZHeng2Chen
帖子: 15
注册时间: 2012-03-13 10:32

Gvim编译包内的java文件出现错误

#1

帖子 ZHeng2Chen » 2012-11-17 18:04

通过Gvim调试java程序,程序截图如下:
图片
从上图可以看出:
包:

代码: 全选

package IISAnalysis;
含有两个类:

代码: 全选

  class
    Search
  class
    IIS_Count
问题,我通过Gvim打开search.java,按F5(F5为编译快捷键),提示错误,如下所示:

代码: 全选

"Search.java" 72L, 2230C 已写入
:!javac Search.java
Search.java:19: 找不到符号
符号: 类 IIS_Count
位置: 类 IISAnalysis.Search
        IIS_Count logcount      = new IIS_Count();
        ^
Search.java:19: 找不到符号
符号: 类 IIS_Count
位置: 类 IISAnalysis.Search
        IIS_Count logcount      = new IIS_Count();
                                      ^
2 错误

Shell 已返回1  
可以看出,search类包含main函数,但是却并没有识别出包IISAnalysis内的另一个类IIS_Count,但是代码在MyEclipse下没问题

我的观点是:可能Gvim并没有识别包内的另一个文件IIS_Count类,那么就存在2个问题
1. Gvim是否能识别包内的其他文件并引入呢?如果不识别的话,那我这个程序肯定不行的了,但是别人使用他来编译c代码都可以了

2. 怎么解决上述问题呢?就是如何让我的Gvim能识别包内的其他文件?
源码:
Search.java

代码: 全选

package IISAnalysis;

import java.io.*;

public class Search {
	public String get_date(){
		return "Date:\t"+this.Date+"\n";
	}
	public String get_Countall(){
		return "Count:\t"+String.valueOf(Count_all)+"\n";
	}
	
	/**
     * 以行为单位读取文件,常用于读面向行的格式化文件
     */
    public static void readFileByLines(String fileName) {
        File file = new File(fileName);
        BufferedReader reader = null;
        IIS_Count logcount	= new IIS_Count();
        try {
            System.out.println("\t以行为单位读取文件内容,一次读一整行:");
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            int line = 1;
            // 一次读入一行,直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
            	if(tempString.charAt(0)!='#'){
            		//System.out.println("line " + line + ": " + tempString);
                	line++;
            	}
            }
            logcount.setVisitNum(line);
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
    }
    
    public static void writeFile(String fileName, Search temp) throws Exception {
    	try {  
    		//打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件  
    		FileWriter writer = new FileWriter(fileName, true);  
    		writer.write(temp.get_date());
    		writer.write(temp.get_Countall());
    		writer.close();  
    	} catch (IOException e) {  
    		e.printStackTrace();  
    	}  
    }
    
	public static void main(String[] args) throws Exception{
		System.out.println("测 试 开 始  --------");
		Search test=new Search();
		readFileByLines("src/IISAnalysis/iislog");
		writeFile("src/IISAnalysis/log_count",test);
		System.out.println("\n测 试 结 束  --------");
	}
	
	private String	Date;
	private String	Time;
	private int		Count_all;
	private int		Count_user;
	
}
IIS_Count.java

代码: 全选

package IISAnalysis;

import java.util.*;

class IIS_Count {
	/**
	 * 构造器:初始化各属性
	 */
	IIS_Count(){
		this.countReset();
	}
	
	/**
	 * 重置iis各项统计数据为空,以便再次统计日志各项数据
	 */
	public void countReset(){
		this.Log_type	=	"Null";
		this.Date		=	"Null";
		this.Visit_num	=	0;
		this.status.clear();
	}
	
	/**
	 * 设置日志数据的类型
	 */
	public void setLogType(String logtype){
		this.Log_type	=	logtype;
	}
	/**
	 * 获取日志数据类型的统计结果
	 */
	public String getLogType(){
		return	this.Log_type;
	}
	
	/**
	 * 设置日志数据的产生日期
	 */
	public void setDate(String date){
		this.Date	=	date;
	}
	/**
	 * 获取日志数据类型的日期
	 */
	public String getDate(){
		return	this.Date;
	}
	
	/**
	 * 通过计数来统计来访人员数目
	 */
	public void setVisitNum(int	visitnum){
		this.Visit_num	=	visitnum;
	}
	/**
	 * 获取来访人数的统计结果
	 */
	public int getVisitNum(){
		return	this.Visit_num;
	}
	
	
	/**
	 * 通过计数来统计日志运行的返回类型统计,或者错误统计
	 */
	public void setStatus(String temp){
		String[] data = temp.split(" ");
		if( status.containsKey(data[11]) )
			status.put(data[11], 1+this.status.get(data[11]));
	}
	/**
	 * 获取日志返回类型的的统计结果
	 */
	public Map<String, Integer> getStatus(){
		return	this.status;
	}
	
	private String	Log_type;
	private int		Visit_num;
	private String	Date;
	private Map<String, Integer> status =	new HashMap<String, Integer>();
}
xgdgsc
帖子: 277
注册时间: 2010-02-25 11:02
系统: Arch x64

Re: Gvim编译包内的java文件出现错误

#2

帖子 xgdgsc » 2012-11-18 0:14

没意义,Java用Eclipse是王道,不必在vim上浪费时间,用它编辑配置文件就行了。

Sent from my ME865 using Tapatalk 2
头像
ZHeng2Chen
帖子: 15
注册时间: 2012-03-13 10:32

Re: Gvim编译包内的java文件出现错误

#3

帖子 ZHeng2Chen » 2012-11-18 9:23

xgdgsc 写了:没意义,Java用Eclipse是王道,不必在vim上浪费时间,用它编辑配置文件就行了。

Sent from my ME865 using Tapatalk 2
是这样的,可每次远程连接桌面,打开eclipse很慢很卡,而且我的程序是不大不小的那种,整体代码放一起太乱,分开放的话又不能用Gvim关联
头像
ZHeng2Chen
帖子: 15
注册时间: 2012-03-13 10:32

Re: Gvim编译包内的java文件出现错误

#4

帖子 ZHeng2Chen » 2012-12-06 13:19

:em01 ,首先很开心弄明白了为什么vim编译包内的java文件会出问题

首先,我在网上配置的关于vim编译运行java文件的命令是不适合编译java包的

举例比如说:

代码: 全选

package IISAnalysis;
  class
    Search
  class
    IIS_Count
其中Search类使用IIS_Count类,直接vim运行Search文件报错

[命令行编译]
当我们在命令行编译上述包内的文件时,首先是cd命令切换到路径下比如:/home/user/source/IISAnalysis/Search.java

代码: 全选

$cd  /home/user/source
记住,是切换到包IISAnalysis的路径而不是类Search的路径
然后

代码: 全选

javac IISAnalysis/Search.java
编译过后,使用命令来运行

代码: 全选

java IISAnalysis.Search
正确的编译运行方法应该如上所示,但是我们的vim配置里却是使用的是固定的命令

[vim编译]
看看我的vim配置

代码: 全选

" 编译Java源文件
func! CompileJava()
	exec "w"
    exec "!javac %"
endfunc
vim调用CompileJava函数执行java命令:javac,但是CompileJava函数并不能知道我们的包路径以及运行时需要使用java 包名.类名,也就无法向上面命令行编译那样正确的编译运行java文件
所以当我们通过vim会出错是我们的CompileJava函数不够智能的处理我们的java路径和命令

实际上这只是一个简单的小实例,当我们在写很多的包和类时,所需要的命令可能又不一样的是另一种规则,真心希望大牛写出一个compilejava.vim插件给我们运行包或者工程下的java,只需要知道如何将引入的包和类文件连系起来即可,然后调用java命令

可惜俺是菜鸟,继续努力学习吧
回复