javac(1) javac(1) javac - Java javac [ options ] [ sourcefiles ] [ classes] [ @argfiles ] options sourcefiles 1(MyClass.java) classes 1(MyPackage.MyClass) @argfiles 1-J javacJavajavacJava javac2 o o javac(@) .java.classMyClassMyClass.javaMyClass.class MyClass$MyInnerClass.class /workspacecom.mysoft.mypack.MyClass/workspace/com/mysoft/mypack/MyClass.java -d -X o o -Akey[=value] javackey1(.) -cp path or -classpath path ()CLASSPATHCLASSPATH-cp-classpath -sourcepath -processorpath -Djava.ext.dirs=directories -Djava.endorsed.dirs=directories -d directory javacjavac -d /home/myclassescom.mypackage.MyClass/home/myclasses/com/mypackage/MyClass.class -djavac : -d -deprecation -deprecationjavac-deprecation-Xlint:deprecation -encoding encoding (EUC-JPUTF-8)-encoding -endorseddirs directories -extdirs directories extdirectoriesJARJAR (Java) -g -g:none -g:[keyword list] source lines vars -help -implicit:[class, none] -implicit:class-implicit:none-implicit -Joption Java Virtual Machine (JVM)optionoptionJava1-J-Xms48m48MBjava(1) : CLASSPATH-classpath-bootclasspath-extdirsjavac-JJava -nowarn -Xlint:none -parameters APIjava.lang.reflect.Executable.getParameters -proc: [none, only] -proc:none-proc:only -processor class1 [,class2,class3...] -processorpath path -s dir javac -s /home/mysrccom.mypackage.MyClass/home/mysrc/com/mypackage/MyClass.java -source release release 1.3 Java SE 1.3 1.4 Java SE 1.4 1.5 Java SE 5 5 1.5 1.6 Java SE 6Java Platform, Standard Edition 6 1.6 1.7 Java SE 7 7 1.7 1.8 Java SE 8 8 1.8 -sourcepath sourcepath Oracle Solaris(:)WindowsJARZIP : -verbose -version -werror -X javacjavacJava-bootclasspath-extdirs -target version JVM1.11.21.31.41.5 (5)1.6 (6)1.7 (7)1.8 (8) -target-source o -source-target1.8 o -source1.2-target1.4 o -source1.3-target1.4 o -source1.5-target1.8 o -source1.6-target1.8 o -source1.7-target1.8 o -source-target-source -bootclasspath bootclasspath (:)JARZIP JDK 8javacJavaJREJava compact1compact2compact3API -profile javac -profile compact1 Hello.java javacJava SE API cd jdk1.8.0/bin ./javac -profile compact1 Paint.java Paint.java:5: error: Applet is not available in profile 'compact1' import java.applet.Applet; Applet-profileJava SE API(Applet) -bootclasspathrt.jar-profile -Xbootclasspath/p:path -Xbootclasspath/a:path -Xbootclasspath/:path -Xdoclint:[-]group [/access] groupaccessibilitysyntaxreferencehtmlmissingjavadoc-Xdoclint-Xdoclintjavac access-Xdoclintpublicprotectedpackageprivate()1(protectedpackagepublic) protected() -Xdoclint:all/protected package(packagepublic)HTML -Xdoclint:all,-html/package -Xdoclint:none -Xdoclint:all[/access] -Xlint -Xlint:all -Xlint:none -Xlint:name -Xlint -Xlint:-name -Xlint-Xlint -Xmaxerrs number -Xmaxwarns number -Xstdout filename System.err -Xprefer:[newer,source] ()-Xprefer:newer()-Xprefer:sourceSOURCE-Xprefer:source -Xpkginfo:[always,legacy,nonempty] javacpackage-info.javapackage-info.classmode always package-info.javapackage-info.class.java.classAnt legacy package-info.javapackage-info.classpackage-info.javapackage-info.class : package-info.classpackage-info.javaRetentionPolicy.SOURCE nonempty package-info.javaRetentionPolicy.CLASSRetentionPolicy.RUNTIMEpackage-info.class -Xprint -XprintProcessorInfo -XprintRounds -XLINT -Xlint:namenamename-Xlint:-name: cast String s = (String) "Hello!" classfile deprecation java.util.Date myDate = new java.util.Date(); int currentDay = myDate.getDay(); java.util.Date.getDayJDK 1.1 dep-ann @deprecated Javadoc@Deprecated /** * @deprecated As of Java SE 7, replaced by {@link #newMethod()} */ public static void deprecatedMethood() { } public static void newMethod() { } divzero 0 int divideByZero = 42 / 0; empty if class E { void m() { if (true) ; } } fallthrough fall-throughswitchFall-throughswitchbreakswitchcase 1break switch (x) { case 1: System.out.println("1"); // No break statement here. case 2: System.out.println("2"); } -Xlint:fallthroughcasefall-through finally finally public static int m() { try { throw new NullPointerException(); } catch (NullPointerException(); { System.err.println("Caught NullPointerException."); return 1; } finally { return 0; } } finallyint0finallytrycatchintfinally options overrides 2 public class ClassWithVarargsMethod { void varargsMethod(String... s) { } } public class ClassWithOverridingMethod extends ClassWithVarargsMethod { @Override void varargsMethod(String[] s) { } } warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod overrides varargsMethod(String...) in ClassWithVarargsMethod; overriding method is missing '...' varargsvarargsClassWithVarargsMethod.varargsMethodvarargsString... sString[] sClassWithOverridingMethod.varargsMethod path ()@SuppressWarnings javac -Xlint:path -classpath /nonexistentpath Example.java processing AnnocProc.java: import java.util.*; import javax.annotation.processing.*; import javax.lang.model.*; import.javaz.lang.model.element.*; @SupportedAnnotationTypes("NotAnno") public class AnnoProc extends AbstractProcessor { public boolean process(Set elems, RoundEnvironment renv){ return true; } public SourceVersion getSupportedSourceVersion() { return SourceVersion.latest(); } } AnnosWithoutProcessors.java: @interface Anno { } @Anno class AnnosWithoutProcessors { } AnnoProcAnnosWithoutProcessors.java javac AnnoProc.java javac -cp . -Xlint:processing -processor AnnoProc -proc:only AnnosWithoutProcessors.java AnnosWithoutProcessors.java warning: [processing] No processor claimed any of these annotations: Anno AnnosWithoutProcessorsAnnoNotAnno rawtypes rawrawtypes void countElements(List l) { ... } rawtypes void countElements(List l) { ... } ListrawListListList(?)countElementsList Serial serialVersionUID public class PersistentTime implements Serializable { private Date time; public PersistentTime() { time = Calendar.getInstance().getTime(); } public Date getTime() { return time; } } warning: [serial] serializable class PersistentTime has no definition of serialVersionUID serialVersionUIDJavaserialVersionUIDserialVersionUID serialVersionUIDInvalidClassExceptionsJavaserialVersionUIDserialVersionUID static static class XLintStatic { static void m1() { } void m2() { this.m1(); } } warning: [static] static method should be qualified by type name, XLintStatic, instead of by an expression staticm1 XLintStatic.m1(); staticm1 try try-with-resourcestrytryac try ( AutoCloseable ac = getResource() ) { // do nothing} unchecked Java List l = new ArrayList(); List ls = l; // unchecked warning ArrayListListArrayListList lsListlListlsJVMlListlList Listl (staticList)Listls (staticList)Java SEListListListl (Listraw)ls varargs (varargs) public class ArrayBuilder { public static void addToList (List listArg, T... elements) { for (T x : elements) { listArg.add(x); } } } : ArrayBuilder.addToList warning: [varargs] Possible heap pollution from parameterized vararg type T varargsvarargsJavaArrayBuilder.addToListvarargsT...T[]()varargsObject[] javacjavac(-J)1javac javac (*)(*.java)(@)-J javac(@)javac(@) 1 argfilejavac javac @argfile 2 2 2 javac2 options -d classes -g -sourcepath /java/pubs/ws/1.3/src/share/classes classes MyClass1.java MyClass2.java MyClass3.java javac javac @options @classes 3 (path1path2) javac @path1/options @path2/classes javacapt APIjavax.annotation.processingjavax.lang.model -proc:none-processorpathMETA-INF/services/javax.annotation.processing.Processor11-processor 2 1-proc:only -implicit java.applet.Applet(java.awt.Paneljava.awt.Containerjava.awt.Componentjava.lang.Object) ()CLASSPATH-classpath -sourcepath -bootclasspath-extdirs -Xprefernewer2sourcenewer -Xprefer-implicitnoneclass -implicit()-implicit javacjavax.toolsJava Compiler API JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); javac javax.tools.JavaCompiler/ : APIJava Compiler API com.sun.tools.javac.Mainstatic2 public static int compile(String[] args); public static int compile(String[] args, PrintWriter out); args out returnjavacexit : com.sun.tools.javac(com.sun.tools.javac) 1 greetingsHello.javaHello.javagreetings.Hellogreetings-d Hello.java package greetings; public class Hello { public static void main(String[] args) { for (int i=0; i < args.length; i++) { System.out.println("Hello " + args[i]); } } } greetings.Hello: javac greetings/Hello.java greetings.Hello: java greetings.Hello World Universe Everyone Hello World Hello Universe Hello Everyone 2 greetingsAloha.javaGutenTag.javaHello.javaHi.java % javac greetings/*.java % ls greetings Aloha.class GutenTag.class Hello.class Hi.class Aloha.java GutenTag.java Hello.java Hi.java 3 1 pwd /examples javac greetings/Hi.java greetings.HigreetingsCLASSPATH-classpath javac -classpath /examples /examples/greetings/Hi.java greetings.Hi javac -classpath /examples:/lib/Banners.jar \ /examples/greetings/Hi.java greetingsgreetingsgreetings java -classpath /examples:/lib/Banners.jar greetings.Hi 4 javacJVM 1.7 javac -source 1.7 -target 1.7 -bootclasspath jdk1.7.0/lib/rt.jar \ -extdirs "" OldCode.java -source 1.7OldCode.java1.7(7)Java-target 1.7JVM 1.7-target-source-target -bootclasspath(rt.jar) javac -source 1.7 OldCode.java warning: [options] bootstrap class path not set in conjunction with -source 1.7 (1.7Java)(Java SE 7) 5 javacJVM 1.7 javac -source 1.7 -target 1.7 -bootclasspath jdk1.7.0/lib/rt.jar \ -extdirs "" OldCode.java -source 1.7OldCode.java1.7(7)Java-target 1.7JVM 1.7 -bootclasspath(rt.jar) javac -source 1.7 OldCode.java warning: [options] bootstrap class path not set in conjunction with -source 1.7 (Java SE 7)Java1.7 o java(1) o jdb(1) o javah(1) o javadoc(1) o jar(1) o jdb(1) JDK 8 201533 javac(1)