Ubuntu下eclipse开发hadoop应用程序环境配置
2015-07-28 13:11
447 查看
大家好,今天给大家介绍一下Ubuntu下eclipse开发hadoop应用程序环境配置,目的很简单,为进行研究与学习,部署一个hadoop运行环境,并搭建一个hadoop开发与测试环境。
环境:Vmware 8.0 和Ubuntu11.04
第一步:下载eclipse-SDK-4.2.1-linux-gtk.tar.gz
http://mirrors.ustc.edu.cn/eclipse/eclipse/downloads/drops4/R-4.2.1-201209141800/eclipse-SDK-4.2.1-linux-gtk.tar.gz
注意:下载linux下的32位eclipse,不要下载64位的eclipse,不然会无法启动eclipse
第二步:下载最新版本的hadoop插件
https://issues.apache.org/jira/secure/attachment/12460491/hadoop-eclipse-plugin-0.20.3-SNAPSHOT.jar
重命名:将下载的插件重命名为"hadoop-0.20.2-eclipse-plugin.jar"
将hadoop-0.20.2-eclipse-plugin.jar 复制到eclipse/plugins目录下,重启eclipse。
1、在左边的 project explorer 上头会有一个 DFS locations的标志
2、在 windows -> preferences里面会多一个hadoop map/reduce的选项,选中这个选项,然后右边,把下载的hadoop根目录选中
如果能看到以上两点说明安装成功了。
第三步:配置hadoop路径
Window -> Preferences 选择 “Hadoop Map/Reduce”,点击“Browse...”选择Hadoop文件夹的路径。
这个步骤与运行环境无关,只是在新建工程的时候能将hadoop根目录和lib目录下的所有jar包自动导入。
第四步:添加一个MapReduce环境
插件装完了,启动hadoop,然后就可以建一个hadoop连接了,就相当于eclipse里配置一个 weblogic的连接。
如图所示,打开Map/Reduce Locations 视图,在右上角有个大象的标志点击
在eclipse下端,控制台旁边会多一个Tab,叫“Map/Reduce Locations”,在下面空白的地方点右键,选择“New Hadoop location...”,如图所示:
location name: 这个随便填写,我填写的是:hadoop.
Map/Reduce Master 这个框里
Host:就是jobtracker 所在的集群机器,这里写localhost
Hort:就是jobtracker 的port,这里写的是9101
这两个参数就是mapred-site.xml里面mapred.job.tracker里面的ip和port
DFS Master 这个框里
Host:就是namenode所在的集群机器,这里写localhost
Port:就是namenode的port,这里写9100
这两个参数就是core-site.xml里面fs.default.name里面的ip和port
(Use M/R master host,这个复选框如果选上,就默认和Map/Reduce Master这个框里的host一样,如果不选择,就可以自己定义输入,这里jobtracker 和namenode在一个机器上,所
以是一样的,就勾选上)
user name:这个是连接hadoop的用户名,因为我是用sony用户安装的hadoop,而且没建立其他的用户,所以就用sony。
下面的不用填写。
然后点击finish按钮,此时,这个视图中就有多了一条记录。
重启eclipse并重新编辑刚才建立的那个连接记录,如图现在我们编辑advance parameters tab页
(重启编辑advance parameters tab页原因:在新建连接的时候,这个advance paramters tab页面的一些属性会显示不出来,显示不出来也就没法设置,所以必须重启一下eclipse再进来编辑才能看到)
这里大部分的属性都已经自动填写上了,其实就是把core-defaulte.xml、hdfs-defaulte.xml、mapred-defaulte.xml里面的一些配置属性展示出来。因为在安装hadoop的时候,其site系列配置文件里有改动,所以这里也要弄成一样的设置。主要关注的有以下属性:
fs.defualt.name:这个在General tab页已经设置了
mapred.job.tracker:这个在General tab页也设置了
hadoop.job.ugi:刚才说看不见的那个,就是这个属性,这里要填写:sony,Tardis,逗号前面的是连接的hadoop的用户,逗号后面就写死Tardis
然后点击finish,然后就连接上了
第五步:使用eclipse对HDFS内容进行修改
经过上一步骤,左侧“Project Explorer”中应该会出现配置好的HDFS,点击右键,可以进行新建文件夹、删除文件夹、上传文件、下载文件、删除文件等操作。注意:每一次操作完在eclipse中不能马上显示变化,必须得刷新一下。
在/home/tanglg1987/input 目录下新建两个文件file01.txt,file02.txt
file01.txt内容如下:
[plain] view
plaincopy
hello hadoop
file02.txt内容如下:
[plain] view
plaincopy
hello world
上传本地文件到hdfs:
[plain] view
plaincopy
hadoop fs -put /home/tanglg1987/file01.txt input
hadoop fs -put /home/tanglg1987/file02.txt input
第六步:创建工程
File -> New -> Project 选择“Map/Reduce Project”,然后输入项目名称,创建项目。插件会自动把hadoop根目录和lib目录下的所有jar包导入。
第七步:新建一个WordCount.java,这里使用系统自带的TokenCountMapper和LongSumReducer,代码如下:
[java] view
plaincopy
package com.baison.action;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.lib.TokenCountMapper;
import org.apache.hadoop.mapred.lib.LongSumReducer;
public class WordCount {
public static void main(String[] args) {
JobClient client = new JobClient();
JobConf conf = new JobConf(WordCount.class);
String[] arg = { "hdfs://localhost:9100/user/tanglg1987/input",
"hdfs://localhost:9100/user/tanglg1987/output" };
FileInputFormat.addInputPath(conf, new Path(arg[0]));
FileOutputFormat.setOutputPath(conf, new Path(arg[1]));
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(LongWritable.class);
conf.setMapperClass(TokenCountMapper.class);
conf.setCombinerClass(LongSumReducer.class);
conf.setReducerClass(LongSumReducer.class);
client.setConf(conf);
try {
JobClient.runJob(conf);
} catch (Exception e) {
e.printStackTrace();
}
}
}
第八步:运行WordCount
Run As -> Run on Hadoop 选择之前配置好的MapReduce运行环境,点击“Finish”运行。
运行过程如下:
12/10/18 22:53:38 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
12/10/18 22:53:38 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
12/10/18 22:53:38 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
12/10/18 22:53:38 INFO mapred.FileInputFormat: Total input paths to process : 2
12/10/18 22:53:39 INFO mapred.JobClient: Running job: job_local_0001
12/10/18 22:53:39 INFO mapred.FileInputFormat: Total input paths to process : 2
12/10/18 22:53:39 INFO mapred.MapTask: numReduceTasks: 1
12/10/18 22:53:39 INFO mapred.MapTask: io.sort.mb = 100
12/10/18 22:53:39 INFO mapred.MapTask: data buffer = 79691776/99614720
12/10/18 22:53:39 INFO mapred.MapTask: record buffer = 262144/327680
12/10/18 22:53:39 INFO mapred.MapTask: Starting flush of map output
12/10/18 22:53:39 INFO mapred.MapTask: Finished spill 0
12/10/18 22:53:39 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
12/10/18 22:53:39 INFO mapred.LocalJobRunner: hdfs://localhost:9100/user/tanglg1987/input/file01.txt:0+12
12/10/18 22:53:39 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
12/10/18 22:53:39 INFO mapred.MapTask: numReduceTasks: 1
12/10/18 22:53:39 INFO mapred.MapTask: io.sort.mb = 100
12/10/18 22:53:39 INFO mapred.MapTask: data buffer = 79691776/99614720
12/10/18 22:53:39 INFO mapred.MapTask: record buffer = 262144/327680
12/10/18 22:53:39 INFO mapred.MapTask: Starting flush of map output
12/10/18 22:53:39 INFO mapred.MapTask: Finished spill 0
12/10/18 22:53:39 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000001_0 is done. And is in the process of commiting
12/10/18 22:53:39 INFO mapred.LocalJobRunner: hdfs://localhost:9100/user/tanglg1987/input/file02.txt:0+13
12/10/18 22:53:39 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000001_0' done.
12/10/18 22:53:39 INFO mapred.LocalJobRunner:
12/10/18 22:53:39 INFO mapred.Merger: Merging 2 sorted segments
12/10/18 22:53:39 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 69 bytes
12/10/18 22:53:39 INFO mapred.LocalJobRunner:
12/10/18 22:53:39 INFO mapred.TaskRunner: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
12/10/18 22:53:39 INFO mapred.LocalJobRunner:
12/10/18 22:53:39 INFO mapred.TaskRunner: Task attempt_local_0001_r_000000_0 is allowed to commit now
12/10/18 22:53:39 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to hdfs://localhost:9100/user/tanglg1987/output
12/10/18 22:53:39 INFO mapred.LocalJobRunner: reduce > reduce
12/10/18 22:53:39 INFO mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done.
12/10/18 22:53:40 INFO mapred.JobClient: map 100% reduce 100%
12/10/18 22:53:40 INFO mapred.JobClient: Job complete: job_local_0001
12/10/18 22:53:40 INFO mapred.JobClient: Counters: 15
12/10/18 22:53:40 INFO mapred.JobClient: FileSystemCounters
12/10/18 22:53:40 INFO mapred.JobClient: FILE_BYTES_READ=49601
12/10/18 22:53:40 INFO mapred.JobClient: HDFS_BYTES_READ=62
12/10/18 22:53:40 INFO mapred.JobClient: FILE_BYTES_WRITTEN=100852
12/10/18 22:53:40 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=25
12/10/18 22:53:40 INFO mapred.JobClient: Map-Reduce Framework
12/10/18 22:53:40 INFO mapred.JobClient: Reduce input groups=3
12/10/18 22:53:40 INFO mapred.JobClient: Combine output records=4
12/10/18 22:53:40 INFO mapred.JobClient: Map input records=2
12/10/18 22:53:40 INFO mapred.JobClient: Reduce shuffle bytes=0
12/10/18 22:53:40 INFO mapred.JobClient: Reduce output records=3
12/10/18 22:53:40 INFO mapred.JobClient: Spilled Records=8
12/10/18 22:53:40 INFO mapred.JobClient: Map output bytes=57
12/10/18 22:53:40 INFO mapred.JobClient: Map input bytes=25
12/10/18 22:53:40 INFO mapred.JobClient: Combine input records=4
12/10/18 22:53:40 INFO mapred.JobClient: Map output records=4
12/10/18 22:53:40 INFO mapred.JobClient: Reduce input records=4
查看运行结果:
在输出目录中,可以看见WordCount程序的输出文件。除此之外,还可以看见一个logs文件夹,里面会有运行的日志。
DFS Locations下面会有一只大象,下面会有一个文件夹,即 hdfs的根目录,这里就是展示的分布式文件系统的目录结构了。
到这里为止,Eclipse hadoop开发环境配置已经完全搭建完毕。最后,就可以在eclipse中像一般java程序那样开发hadoop程序了。哈哈,搞定!
环境:Vmware 8.0 和Ubuntu11.04
第一步:下载eclipse-SDK-4.2.1-linux-gtk.tar.gz
http://mirrors.ustc.edu.cn/eclipse/eclipse/downloads/drops4/R-4.2.1-201209141800/eclipse-SDK-4.2.1-linux-gtk.tar.gz
注意:下载linux下的32位eclipse,不要下载64位的eclipse,不然会无法启动eclipse
第二步:下载最新版本的hadoop插件
https://issues.apache.org/jira/secure/attachment/12460491/hadoop-eclipse-plugin-0.20.3-SNAPSHOT.jar
重命名:将下载的插件重命名为"hadoop-0.20.2-eclipse-plugin.jar"
将hadoop-0.20.2-eclipse-plugin.jar 复制到eclipse/plugins目录下,重启eclipse。
1、在左边的 project explorer 上头会有一个 DFS locations的标志
2、在 windows -> preferences里面会多一个hadoop map/reduce的选项,选中这个选项,然后右边,把下载的hadoop根目录选中
如果能看到以上两点说明安装成功了。
第三步:配置hadoop路径
Window -> Preferences 选择 “Hadoop Map/Reduce”,点击“Browse...”选择Hadoop文件夹的路径。
这个步骤与运行环境无关,只是在新建工程的时候能将hadoop根目录和lib目录下的所有jar包自动导入。
第四步:添加一个MapReduce环境
插件装完了,启动hadoop,然后就可以建一个hadoop连接了,就相当于eclipse里配置一个 weblogic的连接。
如图所示,打开Map/Reduce Locations 视图,在右上角有个大象的标志点击
在eclipse下端,控制台旁边会多一个Tab,叫“Map/Reduce Locations”,在下面空白的地方点右键,选择“New Hadoop location...”,如图所示:
location name: 这个随便填写,我填写的是:hadoop.
Map/Reduce Master 这个框里
Host:就是jobtracker 所在的集群机器,这里写localhost
Hort:就是jobtracker 的port,这里写的是9101
这两个参数就是mapred-site.xml里面mapred.job.tracker里面的ip和port
DFS Master 这个框里
Host:就是namenode所在的集群机器,这里写localhost
Port:就是namenode的port,这里写9100
这两个参数就是core-site.xml里面fs.default.name里面的ip和port
(Use M/R master host,这个复选框如果选上,就默认和Map/Reduce Master这个框里的host一样,如果不选择,就可以自己定义输入,这里jobtracker 和namenode在一个机器上,所
以是一样的,就勾选上)
user name:这个是连接hadoop的用户名,因为我是用sony用户安装的hadoop,而且没建立其他的用户,所以就用sony。
下面的不用填写。
然后点击finish按钮,此时,这个视图中就有多了一条记录。
重启eclipse并重新编辑刚才建立的那个连接记录,如图现在我们编辑advance parameters tab页
(重启编辑advance parameters tab页原因:在新建连接的时候,这个advance paramters tab页面的一些属性会显示不出来,显示不出来也就没法设置,所以必须重启一下eclipse再进来编辑才能看到)
这里大部分的属性都已经自动填写上了,其实就是把core-defaulte.xml、hdfs-defaulte.xml、mapred-defaulte.xml里面的一些配置属性展示出来。因为在安装hadoop的时候,其site系列配置文件里有改动,所以这里也要弄成一样的设置。主要关注的有以下属性:
fs.defualt.name:这个在General tab页已经设置了
mapred.job.tracker:这个在General tab页也设置了
hadoop.job.ugi:刚才说看不见的那个,就是这个属性,这里要填写:sony,Tardis,逗号前面的是连接的hadoop的用户,逗号后面就写死Tardis
然后点击finish,然后就连接上了
第五步:使用eclipse对HDFS内容进行修改
经过上一步骤,左侧“Project Explorer”中应该会出现配置好的HDFS,点击右键,可以进行新建文件夹、删除文件夹、上传文件、下载文件、删除文件等操作。注意:每一次操作完在eclipse中不能马上显示变化,必须得刷新一下。
在/home/tanglg1987/input 目录下新建两个文件file01.txt,file02.txt
file01.txt内容如下:
[plain] view
plaincopy
hello hadoop
file02.txt内容如下:
[plain] view
plaincopy
hello world
上传本地文件到hdfs:
[plain] view
plaincopy
hadoop fs -put /home/tanglg1987/file01.txt input
hadoop fs -put /home/tanglg1987/file02.txt input
第六步:创建工程
File -> New -> Project 选择“Map/Reduce Project”,然后输入项目名称,创建项目。插件会自动把hadoop根目录和lib目录下的所有jar包导入。
第七步:新建一个WordCount.java,这里使用系统自带的TokenCountMapper和LongSumReducer,代码如下:
[java] view
plaincopy
package com.baison.action;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.lib.TokenCountMapper;
import org.apache.hadoop.mapred.lib.LongSumReducer;
public class WordCount {
public static void main(String[] args) {
JobClient client = new JobClient();
JobConf conf = new JobConf(WordCount.class);
String[] arg = { "hdfs://localhost:9100/user/tanglg1987/input",
"hdfs://localhost:9100/user/tanglg1987/output" };
FileInputFormat.addInputPath(conf, new Path(arg[0]));
FileOutputFormat.setOutputPath(conf, new Path(arg[1]));
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(LongWritable.class);
conf.setMapperClass(TokenCountMapper.class);
conf.setCombinerClass(LongSumReducer.class);
conf.setReducerClass(LongSumReducer.class);
client.setConf(conf);
try {
JobClient.runJob(conf);
} catch (Exception e) {
e.printStackTrace();
}
}
}
第八步:运行WordCount
Run As -> Run on Hadoop 选择之前配置好的MapReduce运行环境,点击“Finish”运行。
运行过程如下:
12/10/18 22:53:38 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
12/10/18 22:53:38 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
12/10/18 22:53:38 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
12/10/18 22:53:38 INFO mapred.FileInputFormat: Total input paths to process : 2
12/10/18 22:53:39 INFO mapred.JobClient: Running job: job_local_0001
12/10/18 22:53:39 INFO mapred.FileInputFormat: Total input paths to process : 2
12/10/18 22:53:39 INFO mapred.MapTask: numReduceTasks: 1
12/10/18 22:53:39 INFO mapred.MapTask: io.sort.mb = 100
12/10/18 22:53:39 INFO mapred.MapTask: data buffer = 79691776/99614720
12/10/18 22:53:39 INFO mapred.MapTask: record buffer = 262144/327680
12/10/18 22:53:39 INFO mapred.MapTask: Starting flush of map output
12/10/18 22:53:39 INFO mapred.MapTask: Finished spill 0
12/10/18 22:53:39 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
12/10/18 22:53:39 INFO mapred.LocalJobRunner: hdfs://localhost:9100/user/tanglg1987/input/file01.txt:0+12
12/10/18 22:53:39 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
12/10/18 22:53:39 INFO mapred.MapTask: numReduceTasks: 1
12/10/18 22:53:39 INFO mapred.MapTask: io.sort.mb = 100
12/10/18 22:53:39 INFO mapred.MapTask: data buffer = 79691776/99614720
12/10/18 22:53:39 INFO mapred.MapTask: record buffer = 262144/327680
12/10/18 22:53:39 INFO mapred.MapTask: Starting flush of map output
12/10/18 22:53:39 INFO mapred.MapTask: Finished spill 0
12/10/18 22:53:39 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000001_0 is done. And is in the process of commiting
12/10/18 22:53:39 INFO mapred.LocalJobRunner: hdfs://localhost:9100/user/tanglg1987/input/file02.txt:0+13
12/10/18 22:53:39 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000001_0' done.
12/10/18 22:53:39 INFO mapred.LocalJobRunner:
12/10/18 22:53:39 INFO mapred.Merger: Merging 2 sorted segments
12/10/18 22:53:39 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 69 bytes
12/10/18 22:53:39 INFO mapred.LocalJobRunner:
12/10/18 22:53:39 INFO mapred.TaskRunner: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
12/10/18 22:53:39 INFO mapred.LocalJobRunner:
12/10/18 22:53:39 INFO mapred.TaskRunner: Task attempt_local_0001_r_000000_0 is allowed to commit now
12/10/18 22:53:39 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to hdfs://localhost:9100/user/tanglg1987/output
12/10/18 22:53:39 INFO mapred.LocalJobRunner: reduce > reduce
12/10/18 22:53:39 INFO mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done.
12/10/18 22:53:40 INFO mapred.JobClient: map 100% reduce 100%
12/10/18 22:53:40 INFO mapred.JobClient: Job complete: job_local_0001
12/10/18 22:53:40 INFO mapred.JobClient: Counters: 15
12/10/18 22:53:40 INFO mapred.JobClient: FileSystemCounters
12/10/18 22:53:40 INFO mapred.JobClient: FILE_BYTES_READ=49601
12/10/18 22:53:40 INFO mapred.JobClient: HDFS_BYTES_READ=62
12/10/18 22:53:40 INFO mapred.JobClient: FILE_BYTES_WRITTEN=100852
12/10/18 22:53:40 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=25
12/10/18 22:53:40 INFO mapred.JobClient: Map-Reduce Framework
12/10/18 22:53:40 INFO mapred.JobClient: Reduce input groups=3
12/10/18 22:53:40 INFO mapred.JobClient: Combine output records=4
12/10/18 22:53:40 INFO mapred.JobClient: Map input records=2
12/10/18 22:53:40 INFO mapred.JobClient: Reduce shuffle bytes=0
12/10/18 22:53:40 INFO mapred.JobClient: Reduce output records=3
12/10/18 22:53:40 INFO mapred.JobClient: Spilled Records=8
12/10/18 22:53:40 INFO mapred.JobClient: Map output bytes=57
12/10/18 22:53:40 INFO mapred.JobClient: Map input bytes=25
12/10/18 22:53:40 INFO mapred.JobClient: Combine input records=4
12/10/18 22:53:40 INFO mapred.JobClient: Map output records=4
12/10/18 22:53:40 INFO mapred.JobClient: Reduce input records=4
查看运行结果:
在输出目录中,可以看见WordCount程序的输出文件。除此之外,还可以看见一个logs文件夹,里面会有运行的日志。
DFS Locations下面会有一只大象,下面会有一个文件夹,即 hdfs的根目录,这里就是展示的分布式文件系统的目录结构了。
到这里为止,Eclipse hadoop开发环境配置已经完全搭建完毕。最后,就可以在eclipse中像一般java程序那样开发hadoop程序了。哈哈,搞定!
相关文章推荐
- JAVA字符串格式化-String.format()的使用
- 使用自定义模板为Myeclipse添加新建Filter的功能
- java虚拟机优化--gc日志
- Spring中ThreadLocal的认识
- (转)Spring中ThreadLocal的认识
- 用Maven整合SpringMVC+Spring+Hibernate 框架,实现简单的插入数据库数据功能
- 解决eclipse中android添加重载函数时参数为arg0,arg1的问题
- ubuntu下配置JDK+Hadoop+Eclipse
- Java对象的相等性判断:equasl( )方法 与 ==操作符
- Java时间差及时间比较
- 学习spring事务是看的几篇文章,记一下
- [笔记][思维导图]读深入理解JAVA内存模型整理的思维导图
- 转载:(eclipse+avd)不能运行main函数!
- MyEclipse快捷键大全
- Eclipse-Eclispe导入正确工程后出现xml等文件报错
- 【转载】Java如何实现文件打包下载功能
- Java对象的相等性判断 equasl( )方法 与 ==操作符
- ios的消息推送,Java实现的
- Java(一)——认识Java语言
- J2EE的十三个规范