This guide is protected under copyright law, furnished for informational use only, is subject to change without notice, and should not be construed as a
commitment by Adobe Systems Incorporated. Adobe Systems Incorporated assumes no responsibility or liability for any errors or inaccuracies that may appear
in the informational content contained in this guide.
This guide is licensed for use under the terms of the Creative Commons Attribution Non-Commercial 3.0 License. This License allows users to copy, distribute,
and transmit the guide for noncommercial purposes only so long as (1) proper attribution to Adobe is given as the owner of the guide; and (2) any reuse or
distribution of the guide contains a notice that use of the guide is governed by these terms. The best way to provide notice is to include the following link. To
view a copy of this license, visit
Adobe, the Adobe logo, Flex, and Flash Builder are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other
countries.
ActiveX and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. Java is a trademark
or registered trademark of Sun Microsystems, Inc. in the United States and other countries. All other trademarks are the property of their respective owners.
Updated Information/Additional Third Party Code Information available at http://www.adobe.com/go/thirdparty
Portions include software under the following terms:
This product contains either BISAFE and/or TIPEM software by RSA Data Security, Inc.
Adobe Systems Incorporated, 345 Park Avenue, San Jose, CA 95110-2704, USA.
Notice to U.S. government end users. The software and documentation are “Commercial Items,” as that term is defined at 48 C.F.R. §2.101, consisting of
“Commercial Computer Software” and “Commercial Computer Software Documentation,” as such terms are used in 48 C.F.R. §12.212 or 48 C.F.R. §227.7202,
as applicable. Consistent with 48 C.F.R. §12.212 or 48 C.F.R. §§227.7202-1 through 227.7202-4, as applicable, the Commercial Computer Software and
Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial items and (b) with only those rights
as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States. For
U.S. Government End Users, Adobe agrees to comply with all applicable equal opportunity laws including, if appropriate, the provisions of Executive Order
11246, as amended, Section 402 of the Vietnam Era Veterans Readjustment Assistance Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of
1973, as amended, and the regulations at 41 CFR Parts 60-1 through 60-60, 60-250 ,and 60-741. The affirmative action clause and regulations contained in the
preceding sentence shall be incorporated by reference.
The Quick Start section contains a full example to get you started using the Adobe® Flex® compiler API.
About the Flex compiler API
The Flex compiler API lets you compile Flex applications from Java applications. You can also create Flex applications
in memory and compile them to SWF files without ever having an MXML file on disk. In addition, the compiler API
lets you output linkage reports and other details about your applications.
You can also create project files and libraries with the compiler API. Libraries are SWC files that define a set of
components for use in your application, theme files, or Runtime Shared Libraries (RSLs). Projects combine Flex
applications and libraries. They let you enforce dependencies between a Flex application and its assets in the
compilation process.
Requirements of the compiler API
The Flex compiler API has the following requirements:
1
Java JDK The compiler API requires that you have the Java interpreter and the javac compiler from JDK version 1.4.2
or later.
Flex SDK The compiler API is not a stand-alone product. It requires the Flex SDK or the SDK included with Flash
Builder.
What’s included
The Flex compiler API includes the following resources:
flex-compiler-oem.jar The flex2.tools.oem.* package used by the compiler API. This JAR file is in the SDK’s lib
directory. For Flash Builder, this JAR file is in the sdks/4.0.0/lib directory.
JavaDocs The API documentation for the public classes and interfaces in the flex2.tools.oem.* package. You can
download the JavaDoc for the compiler API from the
flex_compiler_api_guide.pdf The Flex 4 Compiler API User Guide is a PDF that provides usage documentation for
the compiler API.
Flex doc blog site.
Quick Start
The following example describes how to create a simple Java application that compiles a Flex application.
Create and compile a new application with the compiler API
1 Create a Java application; for example, MyAppCompiler.java:
Ensure that you add the flex-compiler-oem.jar, and the current directory, to your Java classpath.
You can set configuration options in your Java application by using the Configuration class’s methods. The following
example enables the ActionScript optimizer and disables compiler warnings:
// Apply the new configuration to the Application.
application.setConfiguration(config);
long result = application.build(true);
if (result > 0) {
System.out.println("COMPILE OK");
} else {
System.out.println("COMPILE FAILED");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
FLEX 4 COMPILER API
Introduction
3
To compile applications with some advanced features, you must pass a valid Flash Builder Premier license key to your
application. You can do this with the Configuration class’s
setLicense() method. The following example sets the
public class MyDataVisAppCompiler {
public static void main(String[] args) {
try {
Application application = new Application(new
File("../apps/DataVisTestApp.mxml"));
application.setOutput(new File("../apps/DataVisTestApp.swf"));
// Get an instance of the default configuration class.
Configuration config = application.getDefaultConfiguration();
// Replace this with a valid license key.
config.setLicense("flashbuilder4", "0000-0000-0000-0000-0000-0000");
// Apply the new configuration to the Application.
application.setConfiguration(config);
You can pass configuration options to the compiler when using the compiler API. To do this, you get an instance of
the Configuration class using the Application or Library classes’s
options on that instance, and then assign that object to the Application or Library by using the
method.
For most compiler options, there is a 1:1 mapping between the flex2.tools.oem.Configuration API methods and the
compiler options. For example, to set the value of the
true to the Configuration class’s keepCompilerGeneratedActionScript() method:
pass
config.keepCompilerGeneratedActionScript(true);
keep-generated-actionscript compiler option to true, you
Some compiler options, such as source-path and library-path, can use the += operator to append entries to the
source path and library path. For these compiler options, you can replace the entire path using the
setLibraryPath() methods, or you can append new entries to the list with the addSourcePath() and
and
addLibraryPath() methods.
getDefaultConfiguration() method, set the
setConfiguration()
setSourcePath()
Last updated 3/19/2010
FLEX 4 COMPILER API
Introduction
In some cases, the Configuration class does not have a method that maps to a compiler option. You might call a
method of a different class, or call multiple methods. For example, there is no method in the compiler API that enables
and disables all warnings as per the
showBindingWarnings(), showShadowedDeviceFontWarnings(), and showUnusedTypeSelectorWarnings()
warnings compiler option. Instead, you call the showActionScriptWarnings(),
methods.
The following table lists the compiler options that have alternative methods for setting their values:
Compiler optionEquivalent compiler API method or methods
5
dump-config
include-classes
include-file
include-namespaces
include-sources
library-path
link-report
output
resource-bundle-list
source-path
version
warnings
Call the Configuration.keepConfigurationReport(true) method and then the
Report.writeConfigurationReport() method.
Call the Library.addComponent(java.lang.String) method.
Call the Library.addArchiveFile() method.
Call the Library.addComponent(java.net.URI) method.
Call the Library.addComponent(VirtualLocalFile) or
Library.addComponent(java.io.File) method.
Call the Configuration.setLibraryPath() method to replace the value of the default source
path. Call the
source path.
Call the Configuration.keepLinkReport(true) method, then the
Report.writeLinkReport() method.
Call the Application.setOutput() and Library.setOutput()/setDirectory() methods.
Call the Report.getResourceBundleNames() method.
Call the Configuration.setSourcePath() method to replace the value of the default source
path. Call the
source path.
Call the Report.getCompilerVersion() method.
Call the showActionScriptWarnings(), showBindingWarnings(),
showShadowedDeviceFontWarnings(), and showUnusedTypeSelectorWarnings()
methods.
Configuration.addLibraryPath() method to append new values to the default
Configuration.addSourcePath() method to append new values to the default
About option and property precedence
Similar to mxmlc and compc, the default configuration that the compiler API uses is the flex-config.xml file. For
compiling applications, the compiler API also uses local configuration files. The compiler API then applies the
configuration options in flex2.tools.oem.Configuration to create the final set of compiler configuration options.
By default, the compiler invoked by the compiler API populates the default Configuration object with options in the
flex-config.xml file. This file’s location is relative to the location of the mxmlc.jar file. In most cases, this file is in the
SDK’s lib directory, which is the same directory that contains the flex-compiler-oem.jar file. The compiler also uses
local configuration files (such as app_name-config.xml), or you can point to the location of another configuration file
using the Configuration class’s
Configuration options that you set with the compiler API have the same precedence as a command-line compiler
option. This means that they take precedence over all other options (flex-config.xml, alternative configuration file, and
local configuration file).
For more information about using configuration files, see Using Adobe Flex 4.
addConfiguration() method.
Last updated 3/19/2010
FLEX 4 COMPILER API
Introduction
Clearing configurations
You can clear a configuration by calling the Application.setConguration(null) method.
Adding assets to applications
You can add assets to the application by using methods of the Configuration class, such as addExterns(),
addIncludes(), and setTheme(). Using these methods, you can add external themes, libraries, classes, RSLs, and
other types of assets.
The following example uses the Configuration class’s setTheme() method to add several themes to the resulting
application:
long result = application.build(true);
if (result > 0) {
System.out.println("COMPILE OK");
} else {
System.out.println("COMPILE FAILED");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
6
To add a SWC file that contains components, use the addLibraryPath() method. In the following example, the assets
directory contains the MyComponents.swc file:
public class MySourcePathAppCompiler {
public static void main(String[] args) {
String assetRoot = "../assets/";
String outputRoot = "../apps/";
try {
File[] sourcePath = new File[] {new File(assetRoot)};
Application application = new Application(new
File(outputRoot, "TestSourcePathApp.mxml"));
application.setOutput(new
File(outputRoot, "TestSourcePathApp.swf"));
Configuration config = application.getDefaultConfiguration();
// The source path can be a directory.
// All MXML and AS files in that directory are added
// to the source path.
config.addSourcePath(sourcePath);
application.setConfiguration(config);
long result = application.build(true);
if (result > 0) {
System.out.println("COMPILE OK");
} else {
System.out.println("COMPILE FAILED");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
FLEX 4 COMPILER API
Introduction
8
You can also create libraries or components with the compiler API. To add libraries and organize their dependencies
at run time, use the Project class. For more information, see
Using Adobe Flex 4.
Last updated 3/19/2010
Chapter 2: Logging and Reports
The Adobe Flex compiler API lets you generate reports and provide information such as progress and logs during the
compilation process.
Using custom logging
You can capture error messages with the compiler. To do this, you create a custom logger and assign that logger to the
applications that you are compiling.
Use a custom logger
1 Create a Java class that implements the flex2.tools.oem.Logger interface; for example:
public class SimpleLogger implements Logger {
SimpleLogger() {
System.out.println("----------------------------------");
}
public void log(Message msg, int errorCode, String source) {
System.out.println(msg);
System.out.println("----------------------------------");
}
}
9
This class must define the log() method, which takes three arguments: the message, the error code, and the source.
2 In your Java application, call the Application instance’s setLogger() method to assign a logger to that Application;
for example:
application.setLogger(new SimpleLogger());
If you do not call the setLogger() method, the compiler logs messages to the standard output.
3 Compile and run your example.
4 To test the logger, add one or more syntax errors to your sample application; for example:
Last updated 3/19/2010
<?xml version="1.0"?>
<!-- apps/ErrorTestApp.mxml -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
// Generates a warning because there is no return type.
public function doSomethingWrong() {
// Generates an error because x lacks a type.
var x;
}
</fx:Script>
<s:Label text="Hello World"/>
</s:Application>
This example produces output similar to the following:
Not all compiler errors generate valid values for all properties. For example, errors in your MXML code do not
typically produce an error code, so the Logger returns a -1. ActionScript errors, however, do generate an error code.
You can also use the Report class to view Message objects when the compiler runs. For more information, see “Using
reports to view messages” on page 14.
Creating reports
The compiler API includes the capability to create reports about the application, library, or project that you are
compiling. In the reports, you can include details about the application’s linkage, assets, dependencies, libraries, and
resource bundles, in addition to information about the application, such as the background color, height, and width.
To get a report, you use the Application or Library object’s getReport() method. This method returns an instance of
the Report class, which you then use to output information about the target of the compilation.
Before you generate a report by using the Report class, you must build the Application or Library. This means that you
must call the
The following example prints report information to the standard output:
build() method before you can call any reporting methods.
Background Color: 0xFFFFFF
Height : 375 (75%)
Width : 500 (100%)
Page Title : Test App With All Assets
FLEX 4 COMPILER API
Logging and Reports
14
Using reports to view messages
You can also send the messages that the compiler outputs during the compilation to the reports. Message levels include
info, warning, and error. You access an Array of Message objects by using the
class.
The following example gets an array of Message objects and prints them with the Message object’s level:
The most common type of library is a SWC file that contains custom components. You create SWC files by using the
Flex compiler API. Also, you can create a component library that contains components, resource bundles, or other
libraries.
To create a custom component library, you create an instance of the Library class. You then use the addComponent()
method to add components, resource bundles, and archives to the library. You can add components by source file
location, class name, namespace, or by adding dynamically generated component sources. This is the equivalent of
using the
The following example creates a SWC file with two components in it:
include-sources component compiler option to add classes or directories to the SWC file.
16
You can also use a Configuration object, and call its addSourcePath() method to add the assetRoot to the source path.
You then call the Library’s
addComponent() method, and pass it just the component class names, as the following
example shows:
Configuration c = lib.getDefaultConfiguration();
c.addSourcePath(new File(assetRoot));
lib.setConfiguration(c);
lib.addComponent("MyButton");
lib.addComponent("MyLabel");
This is the equivalent of using the include-classes and source-path component compiler options to add classes
that are in the source path to the SWC file.
Creating projects
As with the Application class, the Library class implements the Builder interface. So, you can use Logger, Report, and
Configuration classes with the Library objects in the same way that you use these classes with an Application object.
Last updated 3/19/2010
FLEX 4 COMPILER API
Libraries and Projects
To create a project, you define one or more Application and Library objects. You add these to your project by using
addBuilder() method.
the
If you create a library SWC file and use that SWC file in an application that you also create by using a Project class, use
Project.dependsOn() method. This method ensures that the compiler finishes creating the Library before it
the
attempts to create the Application. You can use any number of
dependsOn() methods to ensure the proper
dependencies in the project are established before compiling the Application.
When creating projects that include libraries, you generally call the addLibraryPath() method to ensure that the
compiler can find the library file during compilation.
The following example creates a project that consists of one application file and one library file. This example creates
the Library object and ensures that the Library object exists before trying to create the Application object by using the
// Add the new SWC file to the library-path.
Configuration config = app.getDefaultConfiguration();
config.addLibraryPath(new File[]
{new File(assetRoot, "MyComponents.swc")});
app.setConfiguration(config);
// Add Application and Library objects to the Project.
project.addBuilder(app);
project.addBuilder(lib);
// Ensure that the Library is created before trying
// to compile the Application.
project.dependsOn(app, lib);
The compiler API includes the capability to create application and library source files at run time and to compile these
files into applications and libraries. To do this, you use the VirtualLocalFile and VirtualLocalFileSystem classes in the
flex2.tools.oem package.
The process for creating an application built with Flex entirely within the Java class is as follows:
1 Create a String that stores the MXML source code. If you are creating a standard Flex application, begin with the
XML declaration and opening
include the necessary namespace declarations.
2 Create a VirtualLocalFile by calling the VirtualLocalFileSystem.create() method. Pass the following
parameters to the
• name: Specifies the canonical path name of the target directory, and a virtual filename. The actual name is not
usually important, but it must be in the correct location and it must have a .as or .mxml extension. The name is
important when you create a custom component that you use in your virtual application.
• text: Specifies the String that stores all the MXML source code for application.
• parent: Specifies the canonical filename for the target directory.
• lastModified: Sets the value of the timestamp on the new virtual file. This is usually the current date and time.
3 Create a new Application object, passing the new VirtualLocalFile object as its parameter.
4 Define the output file for the Application object.
5 Call the Application.build() method.
The following example creates an application that has a simple Button control:
create() method:
<s:Application> tag, and end with a closing </s:Application> tag. Be sure to
You can create an application that uses existing custom components. You can also create the custom components
dynamically. To do this, you create multiple VirtualLocalFile objects, and pass them as an array of files to the
Application object’s constructor.
The following example creates two custom components and adds them to the application:
public class MyVirtualFilesCompiler {
public static void main(String[] args) {
try {
VirtualLocalFileSystem fs = new VirtualLocalFileSystem();
File parent = new File(".").getCanonicalFile();
// The order of arguments here matters. You must create
// the components before you can create the application
// that uses those components.
Application app = new Application(new
VirtualLocalFile[] {vlfComp1, vlfComp2, vlfMain});
app.setLogger(new ComplexLogger());
2 The order of creation for components and applications is important. If your application uses custom components
or other files that are created at the same time, you must create those components before you create the application.
To ensure this, list the components before the application in the Application object’s constructor, as the following
example shows:
Application app = new Application(new VirtualLocalFile[] {vlfComp1, vlfComp2, vlfMain});
Using incremental compilation
You can use incremental compilation with VirtualLocalFile objects. This makes compilation more efficient because
the compiler only recompiles the virtual file that was changed and not all files that are in the application. You typically
use incremental compilation in a Java application that builds a Flex application more than once. The first time the Flex
application is built, the compiler compiles all parts of the application. On subsequent compilations, if you use
incremental compilation, the compiler only compiles the parts of the application that changed.
22
To trigger the use of incremental compilation, use the VirtualLocalFileSystem class’s update() method to change a
virtual local file. Then call the
build() method again to compile the application incrementally.
For more information about incremental compilation, see Using Adobe Flex 4.
The following example calls the changeComponent() method and makes a change to one of the VirtualLocalFile
objects in it. The application then calls the
code. The
build() method ultimately takes less time to compile the application because only the changed code is
fs.update() method, which updates only that virtual file with the new
// The order of arguments here matters. You must create
// the components before you can create the application
// that uses those components.
app = new Application(new VirtualLocalFile[] {vlfComp1, vlfComp2, vlfMain});
app.setLogger(new ComplexLogger());