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 ...
随机推荐
- Dos下的小技巧
1.dos 窗口下怎样复制粘贴 第一种方式:右键标记-->选中-->标题栏右键编辑-->复制 第二种方式:右键-->标记-->选中-->enter 这样就可以复制了 ...
- js中this详解
this对象是在闭包一节中提到的,书上的原话是:"this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数作为某个对象的方法调用时,this等于那个对 ...
- P1251 餐巾计划问题
P1251 餐巾计划问题 题目描述 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 iii 天需要 rir_iri块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费 ...
- 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!'
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- MySQL 水平拆分(读书笔记整理)
转:http://blog.csdn.net/mchdba/article/details/46278687 1,水平拆分的介绍 一般来说,简单的水平切分主要是将某个访问极其平凡的表再按照某个字段的某 ...
- sql 时间转换问题 from_unixtime() UNIX_TIMESTAMP()
http://blog.csdn.net/test_soy/article/details/50328367 from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是 ...
- Git-远程仓库的使用
Git修改远程仓库地址 1.修改命令 git remote set-url origin [url] 例如:$ git remote set-url origin gitlab@gitlab.chum ...
- scrapy_移除内容中html标签
如何移除所获取内容中多余的html标签? 通过w3lib模块和re模块 #!/usr/bin/python3 # -*- coding: UTF-8 -*- __author__ = 'beimenc ...
- Linkin大话eclipse快捷键
刚来这家公司的时候,作为菜鸟的我在帮别人调试代码的时候,有人说我快捷键使用的很熟悉. 呵呵,工欲善其事必先利其器,以下这些快捷键是最常用的也是要必须记住的. [Ctrl开头] Ctrl+1:快速修复 ...
- alwaysOn中关于维护计划的应用方案
由于alwaysOn环境下主副本所在的实际服务器不固定, 所以我目前采取的方案是创建维护计划的时候, 在各个服务器上创建一份维护计划. (假设有2个服务器需要故障转移, 那么就在这两个服务器上分别创建 ...