javac编译乱码
PersonTest.java:1: 错误: 非法字符: \65279
解决途径如下
用记事本打开java源文件,另存为ANSI格式
如果java文件包含中文字符,使用-encoding gbk格式进行编译,如javac -d . PersonTest.java -encoding gbk
(注意,这里如果使用-encoding utf8仍然会报错)
分析:这里之所以提示“非法字符: \65279”,和UTF-8编码有着密切的联系。准确的说,是在UTF-8编码的基础上添加了BOM头( Byte Order Mark)所造成的。它作为一种Unicode签名方式,是UTF编码方案里用于标识编码的标准标记。在UTF-16里本来是FF FE,而在UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当作正常字符处理。
解决方法:使用记事本另存为ANSI格式,或者使用NotePad++修改格式为不含BOM的UTF-8格式(奇怪的是这样做之后,使用记事本打开查看,却是ANSI格式。但总之已经达到了去BOM头的目的。)
在PHP的namespace使用过程当中,也会经常遇到类似的问题,只要使用记事本打开查看,很有可能就会触发这个问题。
另外,与部署相关的问题:
如果java文件内声明了pakage信息,如package test.person;
则编译完成之后,在运行的时候需要在当前路径下执行命令:java test/person/PersonTest或java test.person.PersonTest
如果在test/person目录下执行java PersonTest则依然会报错
其实这主要是系统默认设置的classpath造成的。
如果编译的字节码重新部署到classes目录下:
javac -d classes PerTest.java
则编译时可以:
java -classpath classes test/person/PersonTest
注意,切不可写成 java -classpath classes classes/test/person/PersonTest
这里其实可以分为两种情形,一种是指定classpath的,则filepath无需玩猴子能,只需写packagepath,因为可以自动组装。
第二种情形,没有指定classpath,则需要些完整的filepath:java filepath
此外,如果第一种情形仍有异常,提示找不到所要编译的类,可以在classpath中添加当前路径。
具体格式为: java -classpath classpathexample packagepathexample(contain targer class filename)
注意:classpath与包路径是两码事,运行的时候,查找的路径=classpath/package_path,切不可把二者重叠使用,那样运行时就会找不到class字节码,因为绝对路径错了。
其实,本质上这里一共涉及到三个path,也就是classpath,filepath,packagepath。使用java命令进行运行的时候,本质上是:
java -classpath "classpath" filepath/filename ,这里的filename指的是所要运行的字节码class文件的文件名。filepath是该字节码文件的具体路径。运行时,JVM虚拟机会在filepath找到该文件,然后根据指定的classpath以及class文件内部所包含的包路径信息重新计算出一个完整的路径,如果该路径与实际路径幂等,则是可以正常运行的,否则,仍然会报错提示无法加载该类。
如果编译时临时设置jar包的classpath,可以这样:
javac -classpath "lib/*" -d . *.java
lib目录下都是jar包。
注意:如果一次指定多个classpath,则需要使用“path1;path2”的方式给出classpath。
javac编译乱码的更多相关文章
- javac编译不同目录的源码提示找不到符号
对于单个文件的且不引用其他类文件的java源码用javac编译大家都很熟悉即 javac mycode.java 但是如果这个文件引用到了其他的类文件,在进行编译的时候就会提示找不到符号,这时我们需要 ...
- javac 编译与 JIT 编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- Javac编译和JIT编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- javac编译原理(一)
我们都知道,计算机只能识别二进制语言,是不能直接识别java c c++等高级语言的.将高级语言转化成计算机可以是别的二进制语言,这个过程就叫编译. 有次面试,面试官问了一道“java的编译原理是什么 ...
- Javac编译与JIT编译
本文转载自:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的 ...
- Linux下使用javac编译
Linux下使用javac编译Hadoop程序 首先要配置好Hadoop, 给出两个教程 Hadoop安装教程单机/伪分布式配置Hadoop2.6.0/Ubuntu14.04 Hadoop集群安装配置 ...
- 使用javac编译zookeeper项目
这里记录zookeeper编译源代码上的一些细节的问题. 网上不少关于如何使用ant eclipse来构建zookeeper对应的eclipse工程的记录.这里就不再过多赘述.只做简单阐述. 这里主要 ...
- 【深入Java虚拟机】之七:Javac编译与JIT编译
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理 ...
- javac编译后运行提示找不到或无法加载主类
第一种常见错误: package demo_01; public class hello { public static void main(String[] args) { System.out.p ...
随机推荐
- 解决spring定时任务执行2次和tomcat部署缓慢的问题
spring定时任务执行2次 问题重现和解析 最近使用quartz定时任务框架,结果发现开发环境执行无任何问题,部署到服务器上后,发现同一时间任务执行了多次.经过搜索发现是服务器上tomcat的配置文 ...
- dedecms内容页调用图片集文档的图集图片
2016-8-26 0 条评论 dedecms模板制作 3,209 ℃ 织梦dedecms设置了图片集内容模型的网站栏目文档可以上传图集图片,并提供了单页多图样式.幻灯片样式.多缩略图样式三种表现方式 ...
- 如何更改Linux的ssh端口
1. 修改/etc/ssh/sshd_config里的Port字段 Port 22改为Port 1000(你自定义的端口) 2. 重启sshd服务 #service sshd restart
- 邓_php_笔试!!!
函数总结: ---------------------------------------------------------------------- 数组: 1.数组转换为字符串: implode ...
- Spring @Scheduled 在tomcat容器里面执行两次
今天在用spring里面的@Scheduled执行定时任务,但是发现到触发定时任务的时间点总会执行两次.原因是修改了tomcat conf包下面的server.xml文件导致的.配置如下: <H ...
- P1361 小M的作物
P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第 ...
- 基于esp8266的智能台灯DIY
研究esp8266已经很久了,特制作了一个智能灯, 代码如下,总结几点 一.关于arduino pro mini 的烧写方法 一定要在编译成功之后的下载提示出现的瞬间,单击复位按钮.才可进入烧写 二. ...
- Django 发送邮件
问题: 对于一些错误信息或用户注册账号的时候,需要给用户发送邮件进行验证. 以用户注册发邮件为例子,用户向后端提起注册,后端收到用户邮箱,对邮箱格式进行验证,然后发送邮件,邮件内容中包括邮件标题.邮件 ...
- Java多线程之线程的控制
Java多线程之线程的控制 线程中的7 种非常重要的状态: 初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dea ...
- spark-shell 显示乱码
用spark shell 进入console环境 查看字符集 scala> System.getProperty("file.encoding") res5: String ...