I plugin JDT comprendono un compilatore Java incrementale e batch per la generazione di file .class Java dal codice di origine. Nessuna API è direttamente fornita dal compilatore. Questa viene installata come generatore su progetti Java. La compilazione viene attivata utilizzando meccanismi di generazione della piattaforma standard.
Il meccanismo di creazione della piattaforma viene dettagliatamente descritto nella sezione relativa ai generatori di progetti incrementali.
È possibile compilare in modo programmatico i file origine Java in un progetto utilizzando l'API di generazione.
IProject myProject; IProgressMonitor myProgressMonitor; myProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, myProgressMonitor);
Per un progetto Java, questa richiama il generatore incrementale di progetto Java (insieme a qualsiasi altro generatore incrementale di progetto aggiunto alla specifica di generazione del progetto). I file .class generati vengono scritti nella cartella di output designata. Nella cartella di output vengono copiati anche altri file di risorse.
Nel caso di una generazione di batch completa, tutti i file .class della cartella di output vengono 'ripuliti' per garantire che non vengano rilevati file non aggiornati. Questa operazione viene controllata mediante un'opzione del generatore principale JDT (CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER). L'impostazione predefinita per questa opzione è ripulire le cartelle di output. A meno che questa opzione non venga reimpostata, accertarsi di inserire tutti i file .class per i quali non sono presenti file di origine corrispondenti in cartelle di file di classe separate nel percorso classi e non nella cartella di output.
I generatori incrementali e di batch possono essere configurati con altre opzioni che controllano le risorse copiate nella cartella di output. L'esempio di seguito riportato mostra come impostare un filtro di risorse in modo che i file che terminano con '.ignore' e le cartelle denominate 'META-INF' non vengano copiate nella cartella di output:
Hashtable options = JavaCore.getOptions();
options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/");
JavaCore.setOptions(options);
Filenames are filtered out if they match one of the supplied patterns. Entire folders are filtered out if their name matches one of the supplied folder names which end in a path separator.
È anche possibile configurare i generatori di batch e incrementali in modo che generino un unico errore quando il file .classpath presenta errori. Questa opzione è attiva per impostazione predefinita ed elimina numerosi errori. Per un elenco completo delle opzioni correlate al generatore e delle relative impostazioni predefinite, consultare la sezione relativa alle opzioni del generatore principale JDT.
Il compilatore può essere configurato anche mediante le opzioni JavaCore. Ad esempio, è possibile definire la gravità che deve essere utilizzata per i diversi tipi di problemi rilevati durante la compilazione. Per un elenco completo delle opzioni correlate al compilatore e delle relative impostazioni predefinite, consultare la sezione relativa alle opzioni del compilatore principale JDT.
When programmatically configuring options for the builder or compiler, you should specify the scope of the option. For example, setting up a resource filter may apply to a particular project only:
Hashtable options = myProject.getOptions(false); // get only the options set up in this project options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/"); myProject.setOptions(options);
The batch compiler class is located in the internal classes of the
JDT Core plug-in.
Il nome della classe è org.eclipse.jdt.internal.compiler.batch.Main. It
is packaged into plugins/org.eclipse.jdt.core_3.2.0.jar
. Since 3.2, it is also available as a separate download.
The name of the file is ecj.jar. Its corresponding source is also available. To get them, go to the download page and
search for the section JDT Core Batch Compiler. This jar contains the batch compiler and the javac ant adapter.
So it can be used as a standalone application and inside an Ant build outside of Eclipse.
java -classpath org.eclipse.jdt.core_3.2.0.jar org.eclipse.jdt.internal.compiler.batch.Main
-classpath rt.jar A.java
o:
java -jar org.eclipse.jdt.core_3.2.0.jar -classpath rt.jar A.java
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
Il metodo compile(String)
viene utilizzato per richiamare il compilatore
batch in un'applicazione java. In sostituzione di
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
è possibile scrivere semplicemente
org.eclipse.jdt.internal.compiler.batch.Main.compile("-classpath
rt.jar A.java");
Le opzioni suggerite hanno sfondo arancio.
Nome | Utilizzo | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Opzioni del percorso classi | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-bootclasspath <dir 1>;<dir 2>;...;<dir P> | This is a list of directories or jar files used to bootstrap the class files used by the compiler. Per impostazione predefinita, vengono utilizzate le librerie della VM in esecuzione. Le voci sono separate dal separatore di percorso della piattaforma.
Ciascuna directory o file può specificare le regole di accesso per i tipi tra '[' e ']'. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-cp -classpath <dir 1>;<dir 2>;...;<dir P> |
This is a list of directories or jar files used to compile the source files. Il valore predefinito è quello della proprietà "java.class.path".
Le voci sono separate dal separatore di percorso della piattaforma.
Ciascuna directory o file può specificare regole di accesso per tipi compresi tra '[' and ']' (ad esempio, [-X] per impedire l'accesso al tipo X, [~X] per sconsigliare l'accesso al tipo X, [+p/X:-p/*] per impedire l'accesso a tutti i tipi nel pacchetto p ma consentire l'accesso a p/X). |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-extdirs <dir 1>;<dir 2>;...;<dir P> | This is a list of directories used to specify the location of extension zip/jar files. Le voci sono separate dal separatore di percorso della piattaforma. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-endorseddirs <dir 1>;<dir 2>;...;<dir P> | This is a list of directories used to specify the location of endorsed zip/jar files. Le voci sono separate dal separatore di percorso della piattaforma. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-sourcepath <dir 1>;<dir 2>;...;<dir P> | This is a list of directories used to specify the source files. Le voci sono separate dal separatore di percorso della piattaforma.
Ciascuna directory può specificare le regole di accesso per i tipi tra '[' e ']'. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-d <dir 1>|none | Utilizzato per specificare la directory che conterrà i file .class generati. Se omessa, non verrà creata alcuna struttura di directory per i pacchetti. If you want to generate no .class file at all, use -d none. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-encoding <encoding name> | Specify default source encoding format (custom encoding can also be specified on a per file basis by suffixing each input source file/folder name with [<encoding name>], for example X.java[utf8]). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Opzioni di conformità | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-target 1.1|1.2|1.3|1.4|1.5|5|5.0|1.6|6|6.0 | Specifica le impostazioni di destinazione dei file .class.
I valori possibili sono:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.3 | Imposta il livello di conformità su 1.3. Implicito -source 1.3 -target 1.1. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.4 | Imposta il livello di conformità su 1.4 (predefinito). Implicito -source 1.3 -target 1.2. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.5 | Imposta il livello di conformità su 1.5. Implicito -source 1.5 -target 1.5. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.6 | Imposta il livello di conformità su 1.6. Implicito -source 1.6 -target 1.6. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-source 1.3|1.4|1.5|5|5.0|1.6|6|6.0 | This is used to specify the source level expected by the compiler. I valori possibili sono:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Opzioni di avviso | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-warn:allDeprecation |
Impostazione livello di avviso, ad esempio, -warn:unusedLocal,deprecation Le impostazioni predefinite sono indicate in rosso.
-warn:none disable all warnings -warn:<avvisi separati da ,> abilita esattamente gli avvisi elencati -warn:+<avvisi separati da ,> abilita gli avvisi aggiuntivi -warn:-<avvisi separati da ,> disabilita specifici avvisi
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-nowarn | Nessun avviso (equivalente a -warn:none) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-deprecation | Equivalente a -warn:deprecation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Opzioni di debug | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-g[:none|:lines,vars,source] | Impostare il livello degli attributi di debug
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-preserveAllLocals | Richiede esplicitamente al compilatore di conservare tutte le variabili locali (a scopo di debug). If omitted, the compiler will remove unused locals. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ignored options (for compatibility with javac options) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-J<option> | pass option to the virtual machine | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-X<option> | specify non-standard option. -Xemacs is not ignored. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-X | print non-standard options and exit | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-O | optimize for execution time | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Opzioni avanzate | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@<file> | Legge gli argomenti della riga comandi da un file | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-maxProblems <n> | Numero massimo di problemi per unità di compilazione (100 per impostazione predefinita) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-log <filename> | Specifica un file di log nel quale verrà inserito tutto l'output del compilatore. Opzione molto utile se si desidera eseguire il debug del compilatore batch o se si desidera ottenere un file che contiene tutti gli errori e gli avvisi derivati da una generazione batch. If the extension is .xml, the generated log will be an xml file. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-Xemacs | Use emacs style to present errors and warnings locations into the console
and regular text logs. XML logs are unaffected by this option. With this option
active, the message:
2. WARNING in /workspace/X.java is presented as:
/workspace/X.java:8: warning: The method... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-proceedOnError | Keep compiling in spite of errors, dumping class files with problem methods or problem types. Opzione consigliata solo se si desidera eseguire l'applicazione nonostante contenga errori. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-verbose | Stampa le unità di compilazione elaborare o attivate nella console o nel file di log, se specificato. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-referenceInfo | Elabora le informazioni di riferimento. Utile solo se si è connessi al generatore. Le informazioni di riferimento non sono utili senza connessione al generatore. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-progress | Show progress (only in -log mode). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-time | Display speed information. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-noExit | Do not call System.exit(n) at end of compilation (n=0 if no error). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-repeat <n> | Ripete il processo di compilazione <n> volte (analisi prestazioni). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-inlineJSR | Inline JSR bytecode (implicit if target >= 1.5). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-enableJavadoc | Consider references inside javadoc. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Opzioni di aiuto | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-? -help | Visualizza il messaggio di aiuto. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-v -version | Visualizza il numero di generazione del compilatore. Utile per riportare un difetto. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-showversion | Visualizza il numero di generazione del compilatore e procede. Utile per riportare un difetto. |
d:\temp -classpath rt.jar -time -g -d d:/tmp
|
Compila tutti i file di origine in in d:\temp e nelle relative sottocartelle. Il percorso classi è semplicemente simply rt.jar. Genera tutti gli attributi di debug e tutti i file .class generati vengono inseriti in d:\tmp. La velocità del compilatore verrà visualizzata dopo aver completato il processo batch. |
d:\temp\Test.java -classpath d:\temp;rt.jar -g:none
|
It compiles only Test.java and its dependant files if any, retrieving dependant files from d:\temp. The classpath is d:\temp followed by rt.jar, which means that all necessary classes are searched first in d:\temp and then in rt.jar. It generates no debug attributes and all generated .class files are dumped in d:\temp. |
<?xml version="1.0" encoding="UTF-8" ?> <project name="compile" default="main" basedir="../."> <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/> <property name="root" value="${basedir}/src"/> <property name="destdir" value="d:/temp/bin" /> <target name="main"> <javac srcdir="${root}" destdir="${destdir}" debug="on" nowarn="on" extdirs="d:/extdirs" source="1.4"> <classpath> <pathelement location="${basedir}/../org.eclipse.jdt.core/bin"/> </classpath> </javac> </target> </project>La sintassi utilizzata per l'attività javac ant si trova nella documentazione relativa alle attività javac ant. L'adattatore corrente supporta l'attività Javac Ant 1.4.1 fino alla versione 1.6.5.
Se si utilizza una versione superiore a 1.5.0, è possibile utilizzare l'elemento dell'argomento del compilatore nidificato per indicare le opzioni specifiche del compilatore.
... <javac srcdir="${root}" destdir="${destdir}" debug="on" nowarn="on" extdirs="d:/extdirs" source="1.4"> <classpath> <pathelement location="${basedir}/../org.eclipse.jdt.core/bin"/> </classpath> <compilerarg compiler="org.eclipse.jdt.core.JDTCompilerAdapter" line="-1.5 -warn:+boxing"/> </javac> ...
To prevent from getting compiler dependant scripts, we advise you to use the compiler argument set to org.eclipse.jdt.core.JDTCompilerAdapter
.
In caso contrario, lo script potrà essere utilizzato solo con il,compilatore Eclipse. Se impostato, l'argomento del compilatore nidificato viene ignorato se il nome è diverso dal nome
del compilatore specificato dalla proprietà build.compiler
.
Il JDT di base definisce un indicatore specializzato (tipo di indicatore "org.eclipse.jdt.core.problem") per evidenziare problemi di compilazione. Per scoprire in modo programmatico i problemi rilevati dal compilatore, utilizzare il protocollo degli indicatori di piattaforma standard. Per una panoramica sull'utilizzo degli indicatori, fare riferimento alla sezione relativa agli indicatori di risorse.
Il seguente frammento di codice rileva tutti gli indicatori di problemi Java all'interno di un'unità di compilazione.
public IMarker[] findJavaProblemMarkers(ICompilationUnit cu) throws CoreException { IResource javaSourceFile = cu.getUnderlyingResource(); IMarker[] markers = javaSourceFile.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE); }
Gli indicatori di problemi Java vengono conservati dal generatore di progetto Java e vengono automaticamente rimossi nel momento in cui i problemi vengono risolti e il codice di origine Java viene nuovamente compilato.
The problem id value is set to one of the constants defined in IProblem . L'id del problema è affidabile, tuttavia il messaggio è localizzato, pertanto è possibile modificarlo in base alla locale predefinita. Le costanti definite in IProblem si descrivono autonomamente.
Per raccogliere i problemi rilevati durante un'operazione Java, è necessario definire un'implementazione di
IProblemRequestor.
È possibile riconciliare le copie di lavoro con la rilevazione dei problemi se è stato fornito un
IProblemRequestor
per la creazione della copia di lavoro. A questo scopo, è possibile utilizzare il metodo
reconcile. Ad esempio:
ICompilationUnit unit = ..; // get some compilation unit
// create requestor for accumulating discovered problems
IProblemRequestor problemRequestor = new IProblemRequestor() {
public void acceptProblem(IProblem problem) {
System.out.println(problem.getID() + ": " + problem.getMessage());
}
public void beginReporting() {}
public void endReporting() {}
public boolean isActive() { return true; } // will detect problems if active
};
// use working copy to hold source with error
ICompilationUnit workingCopy = unit.getWorkingCopy(new WorkingCopyOwner() {}, problemRequestor, null);
((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");
// trigger reconciliation
workingCopy.reconcile(NO_AST, true, null, null);
È possibile aggiungere un'azione ai problemi riportati nel metodo acceptProblem(IProblem). In questo esempio, il problema riportato è che Zork non può essere risolto oppure non è una superclasse valida e il relativo id è IProblem.SuperclassNotFound.
SuppressWarnings
In Java 5.0 è possibile disabilitare gli avvisi di compilazione relativi ad un sottoinsieme di un'unità di compilazione
mediante l'annotazione java.lang.SuppressWarning
.
@SuppressWarning("unused") public void foo() { String s; }
Senza l'annotazione, il compilatore indicherebbe che la variabile locale s
non è mai utilizzata.
With the annotation, the compiler silently ignores this warning locally to the foo
method. In tal modo gli avvisi vengono archiviati in altri percorsi della stessa unità di compilazione o dello
stesso progetto.
L'elenco di token che è possibile utilizzare in un'annotazione SuppressWarning
è: