Flex 4.0 Compiler API
Flex 4.0 Compiler API
Adobe Flex 4 Compiler API. 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 http://creativecommons.org/licenses/by-nc-sa/3.0/ 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.
iii
Contents
Chapter 1: Introduction About the Flex compiler API Quick Start Configuring the compiler ........................................................................................... 1 .............................................................................................. 4 .......................................................................................... 6 ............................................................................................................ 1
Chapter 2: Logging and Reports Using custom logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Creating reports Watching progress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Chapter 4: Creating Dynamic Applications About the creation of dynamic applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Using custom components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Using incremental compilation
Chapter 1: Introduction
The Quick Start section contains a full example to get you started using the Adobe Flex compiler API.
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.
Whats 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 SDKs 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 doc blog site.
flex_compiler_api_guide.pdf The Flex 4 Compiler API User Guide is a PDF that provides usage documentation for
Quick Start
The following example describes how to create a simple Java application that compiles a Flex application.
// java/MyAppCompiler.java import flex2.tools.oem.Application; import java.io.*; public class MyAppCompiler { public static void main(String[] args) { try { Application application = new Application(new File("../apps/TestApp.mxml")); application.setOutput(new File("../apps/TestApp.swf")); long result = application.build(true); if (result > 0) { System.out.println("COMPILE OK"); } else { System.out.println("COMPILE FAILED"); } } catch (Exception ex) { ex.printStackTrace(); } } }
4 Run the new application compiler with your Java interpreter; for example:
C:\myapps\src>java -classpath c:\flex\lib\flex-compiler-oem.jar;. MyAppCompiler
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 classs methods. The following example enables the ActionScript optimizer and disables compiler warnings:
// java/MyConfiguringCompiler.java import flex2.tools.oem.Application; import flex2.tools.oem.Configuration; import java.io.*; public class MyConfiguringCompiler { public static void main(String[] args) { String outputRoot = "../apps/"; try { Application application = new Application(new File(outputRoot, "ErrorTestApp.mxml")); application.setOutput(new File(outputRoot, "ErrorTestApp.swf")); Configuration config = application.getDefaultConfiguration(); // Enable ActionScript optimizer. config.optimize(true); // Disable warnings. config.showActionScriptWarnings(false); config.showBindingWarnings(false); config.showUnusedTypeSelectorWarnings(false); // 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(); } } }
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 classs setLicense() method. The following example sets the license key prior to launching the compiler:
// java/MyDataVisAppCompiler.java import flex2.tools.oem.Application; import flex2.tools.oem.Configuration; import java.io.*; 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); long result = application.build(true); if (result > 0) { System.out.println("COMPILE OK"); } else { System.out.println("COMPILE FAILED"); } } catch (Exception ex) { ex.printStackTrace(); } } }
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 setSourcePath() and setLibraryPath() methods, or you can append new entries to the list with the addSourcePath() and addLibraryPath() methods.
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 warnings compiler option. Instead, you call the showActionScriptWarnings(), showBindingWarnings(), showShadowedDeviceFontWarnings(), and showUnusedTypeSelectorWarnings() methods. The following table lists the compiler options that have alternative methods for setting their values:
Compiler option
dump-config
Equivalent compiler API method or methods 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 Configuration.addLibraryPath() method to append new values to the default 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 Configuration.addSourcePath() method to append new values to the default source path. Call the Report.getCompilerVersion() method. Call the showActionScriptWarnings(), showBindingWarnings(), showShadowedDeviceFontWarnings(), and showUnusedTypeSelectorWarnings() methods.
library-path
link-report
version warnings
Clearing configurations
You can clear a configuration by calling the Application.setConguration(null) method.
Application application = new Application(new File(outputRoot, "TestAppWithAssets.mxml")); application.setOutput(new File(outputRoot, "TestAppWithAssets.swf")); Configuration config = application.getDefaultConfiguration(); config.setTheme(fileArray); 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(); } } }
To add a SWC file that contains components, use the addLibraryPath() method. In the following example, the assets directory contains the MyComponents.swc file:
// java/MyLibraryPathCompiler.java import flex2.tools.oem.Application; import flex2.tools.oem.Configuration; import java.io.*; public class MyLibraryPathCompiler { public static void main(String[] args) { String assetRoot = "../assets/"; String outputRoot = "../apps/"; try { Application application = new Application(new File(outputRoot, "TestAppWithAllAssets.mxml")); application.setOutput(new File(outputRoot, "TestAppWithAllAssets.swf")); Configuration config = application.getDefaultConfiguration(); File[] libFile = new File[] {new File(assetRoot, "MyComponents.swc")}; config.addLibraryPath(libFile); 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(); } } }
To add a directory that contains MXML or ActionScript component files that are not in a SWC file, use the addSourcePath() method. In the following example, the assets directory contains several MXML files that are used by the TestSourcePathApp application:
// java/MySourcePathAppCompiler.java import flex2.tools.oem.Application; import flex2.tools.oem.Configuration; import java.io.*; 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(); } } }
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.
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 instances 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:
<?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>
You can access other information about the error, such as the error level and the location of the error, by using the Message classs getLevel(), getPath(), getLine(), and getColumn() methods. The following example prints more information than the SimpleLogger example:
// java/ComplexLogger.java import flex2.tools.oem.Message; import flex2.tools.oem.Logger; import java.util.*; import java.io.*; public class ComplexLogger implements Logger { ComplexLogger() { String LOGFILENAME = "output.txt"; try { System.setOut(new PrintStream(new FileOutputStream(LOGFILENAME))); } catch (Exception e) { System.out.println("There was an error creating the log file."); } System.out.println("Ran at : " + new Date()); System.out.println("----------------------------------"); } public void log(Message msg, int errorCode, String source) { if (msg.getLevel() == "info") { // Suppress info messages. } else { System.out.println("ERROR : " + errorCode); System.out.println("MESSAGE: " + msg); System.out.println("SOURCE : " + source); System.out.println("LEVEL : " + msg.getLevel()); System.out.println("PATH : " + msg.getPath()); System.out.println("LINE : " + msg.getLine()); System.out.println("COLUMN : " + msg.getColumn()); System.out.println("----------------------------------"); } } }
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 applications 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 objects 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 build() method before you can call any reporting methods. The following example prints report information to the standard output:
// java/MyReportCompiler.java import flex2.tools.oem.Application; import flex2.tools.oem.Report; import flex2.tools.oem.Configuration; import flex2.tools.oem.Logger; import java.io.*; public class MyReportCompiler { public static void main(String[] args) { String assetRoot = "../assets/"; String outputRoot = "../apps/"; File[] themeFile = new File[] {new File(assetRoot, "myTheme.css")}; File[] libFile = new File[] {new File(assetRoot, "MyComponents.swc")}; try { Application application = new Application(new File(outputRoot, "TestAppWithAllAssets.mxml")); application.setOutput(new File(outputRoot, "TestAppWithAllAssets.swf")); // Uncomment this line to have log entries written to a file. //application.setLogger(new ComplexLogger()); // Uncomment this line to show progress meter. //application.setProgressMeter(new MyProgressMeter()); Configuration config = application.getDefaultConfiguration(); config.setTheme(themeFile); config.addLibraryPath(libFile); application.setConfiguration(config); application.build(true); Report report = application.getReport(); // Lists the image files that are embedded. System.out.println("\n\nEMBEDDED ASSETS: "); String[] cnames = report.getAssetNames(Report.COMPILER); for (int i=0; i<cnames.length; i++) { System.out.println(cnames[i]); } // Lists the libraries that are used. System.out.println("\nLIBRARIES: "); String[] libs = report.getLibraryNames(Report.COMPILER); for (int i=0; i<libs.length; i++) { System.out.println(libs[i]); }
// Lists source files, their definition names, and dependencies. System.out.println("\nSOURCE NAMES: "); String[] list = report.getSourceNames(Report.COMPILER); for (int i=0; i<list.length; i++) { System.out.println(list[i]); String[] defs = report.getDefinitionNames(list[i]); System.out.println("DEFINITIONS: ");
for (int j=0; j<defs.length; j++) { System.out.println(defs[j]); System.out.println(" DEPENDENCIES: "); String[] deps = report.getDependencies(defs[j]); for (int k=0; k<deps.length; k++) { System.out.println(" " + deps[k]); } System.out.println(" PREREQS: "); String[] prereqs = report.getPrerequisites(defs[j]); for (int k=0; k<prereqs.length; k++) { System.out.println(" " + prereqs[k]); } } } // Get application info. System.out.println("\nAPPLICATION INFO: "); System.out.println(" Background Color: " + "0x" + Integer.toHexString(report.getBackgroundColor()).toUpperCase()); System.out.println(" Height : " + report.getDefaultHeight() + " (" + Math.round(100 * report.getHeightPercent()) + "%)"); System.out.println(" Width : " + report.getDefaultWidth() + " (" + Math.round(100 * report.getWidthPercent()) + "%)"); System.out.println(" Page Title : " + report.getPageTitle()); } catch (Exception ex) { ex.printStackTrace(); } } }
MyLabel mx.binding:BindingManager mx.controls:Image mx.core:DeferredInstanceFromFunction mx.core:IFlexModuleFactory mx.core:mx_internal mx.events:PropertyChangeEvent mx.styles:CSSCondition mx.styles:CSSSelector mx.styles:CSSStyleDeclaration spark.components:Label spark.layouts:VerticalLayout PREREQS: flash.events:IEventDispatcher spark.components:Application APPLICATION INFO: Background Color: Height : Width : Page Title :
0xFFFFFF 375 (75%) 500 (100%) Test App With All Assets
Watching progress
The compiler API includes a progress meter that lets you observe the progress of the compilation.
This class must implement the start(), end(), and percentDone() methods. It adds logic to calculate the elapsed time during compilation.
2 In your Java application that compiles the application, call the Application objects setProgressMeter() method
3 Compile and run your application. This example produces output similar to the following:
begin...1...2...3...4...5...6...7...8...9...10...11...12...13...14...15 ...16...17...18...19...20...21...22...23...24...25...26...27...28...29. ..30...31...32...33...34...35...36...37...38...39...40...41...42...43.. .44...45...46...47...48...49...50...51...52...53...54...55...56...57... 58...59...60...61...62...63...64...65...66...67...68...69...70...71...7 2...73...74...75...76...77...78...79...80...81...82...83...84...85...86 ...87...88...89...90...91...92...93...94...95...96...97...98...99...100 ...done Elapsed Time: 2578ms
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 Librarys 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.
To create a project, you define one or more Application and Library objects. You add these to your project by using the addBuilder() method. 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 the Project.dependsOn() method. This method ensures that the compiler finishes creating the Library before it 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 dependsOn() method.
// java/MyProjectCreator.java import flex2.tools.oem.Application; import flex2.tools.oem.Project; import flex2.tools.oem.Configuration; import flex2.tools.oem.Library; import java.io.*; public class MyProjectCreator { public static void main(String[] args) { String assetRoot = "../assets/"; String outputRoot = "../apps/"; try { Project project=new Project(); // Create the Application. Application app = new Application(new File(outputRoot, "TestAppWithComponents.mxml")); app.setOutput(new File(outputRoot, "TestAppWithComponents.swf")); app.setLogger(new ComplexLogger()); // Create the Library. Library lib=new Library(); lib.setOutput(new File(assetRoot, "MyComponents.swc")); lib.addComponent(new File(assetRoot, "MyButton.mxml")); lib.addComponent(new File(assetRoot, "MyLabel.mxml")); lib.setLogger(new ComplexLogger());
// 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); project.build(true); } catch (Exception ex) { ex.printStackTrace(); } } }
19
XML declaration and opening <s:Application> tag, and end with a closing </s:Application> tag. Be sure to include the necessary namespace declarations.
2 Create a VirtualLocalFile by calling the VirtualLocalFileSystem.create() method. Pass the following
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:
// java/MyVirtualFileCompiler.java import flex2.tools.oem.*; import java.io.*; public class MyVirtualFileCompiler { public static void main(String[] args) { try { File parent = new File(".").getCanonicalFile(); String src = "<?xml version='1.0'?>" + "<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'>" + " <s:Button label='Click Me'/>" + "</s:Application>"; VirtualLocalFileSystem fs = new VirtualLocalFileSystem(); VirtualLocalFile lf = fs.create(new File(parent,"VirtualApp.mxml").getCanonicalPath(), src, parent, System.currentTimeMillis()); Application app = new Application(lf); app.setOutput(new File("VirtualApp.swf")); app.build(true); } catch (Exception ex) { ex.printStackTrace(); } } }
// java/MyVirtualFilesCompiler.java import flex2.tools.oem.*; import java.io.*; public class MyVirtualFilesCompiler { public static void main(String[] args) { try { VirtualLocalFileSystem fs = new VirtualLocalFileSystem(); File parent = new File(".").getCanonicalFile(); String main = "<?xml version='1.0'?>" + "<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' xmlns:comp='*'>" + "<s:layout><s:VerticalLayout/></s:layout>" + "<comp:MyCustomLabel/>" + "<s:Button label='Click Me'/>" + "<comp:MyCustomButton/>" + "</s:Application>"; String comp1 = "<s:Button xmlns:fx='http://ns.adobe.com/mxml/2009' xmlns:s='library://ns.adobe.com/flex/spark' label='Click Me Too'/>"; String comp2 = "<s:Label xmlns:fx='http://ns.adobe.com/mxml/2009' xmlns:s='library://ns.adobe.com/flex/spark' text='Custom Label'/>"; VirtualLocalFile vlfComp1 = fs.create(new File(parent,"MyCustomButton.mxml").getCanonicalPath(), comp1, parent, System.currentTimeMillis()); VirtualLocalFile vlfComp2 = fs.create(new File(parent,"MyCustomLabel.mxml").getCanonicalPath(), comp2, parent, System.currentTimeMillis()); VirtualLocalFile vlfMain = fs.create(new File(parent,"ComplexVirtualApp.mxml").getCanonicalPath(), main, parent, System.currentTimeMillis()); // 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()); app.setOutput(new File("ComplexVirtualApp.swf")); app.build(true); } catch (Exception ex) { ex.printStackTrace(); } } }
When creating an application or library that uses custom components, keep in mind the following details:
1 The name you provide for the name parameter of the create() method is important. It must match the name that
you use in the application. For example, if you refer to a component as <comp:MyCustomComponent>, the name must be "MyCustomComponent", as the following example shows:
VirtualLocalFile vlfComp1 = fs.create(new File(parent,"MyCustomComponent").getCanonicalPath(), comp1, parent, mod);
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 objects constructor, as the following example shows:
Application app = new Application(new VirtualLocalFile[] {vlfComp1, vlfComp2, vlfMain});
"<comp:MyCustomLabel/>" + "<s:Button label='Click Me'/>" + "<comp:MyCustomButton/>" + "</s:Application>"; String comp1 = "<s:Button xmlns:fx='http://ns.adobe.com/mxml/2009' xmlns:s='library://ns.adobe.com/flex/spark' label='Click Me Too'/>"; String comp2 = "<s:Label xmlns:fx='http://ns.adobe.com/mxml/2009' xmlns:s='library://ns.adobe.com/flex/spark' text='Custom Label'/>"; VirtualLocalFile vlfComp1 = fs.create(new File(parent,"MyCustomButton.mxml"). getCanonicalPath(), comp1, parent, System.currentTimeMillis()); VirtualLocalFile vlfComp2 = fs.create(new File(parent,"MyCustomLabel.mxml"). getCanonicalPath(), comp2, parent, System.currentTimeMillis()); VirtualLocalFile vlfMain = fs.create(new File(parent,"ComplexVirtualApp.mxml"). getCanonicalPath(), main, parent, System.currentTimeMillis()); // 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()); app.setOutput(new File("IncrementalVirtualApp.swf")); app.build(true); // Calling changeComponent() updates one of the virtual files, // which lets you then use the update() method to use // incremental compilation.
changeComponent(); } catch (Exception ex) { ex.printStackTrace(); } } public static void changeComponent() { try { String newComp = "<s:Button xmlns:fx='http://ns.adobe.com/mxml/2009' xmlns:s='library://ns.adobe.com/flex/spark' label='Don\'t Click Me'/>"; fs.update(new File(parent,"MyCustomButton.mxml").getCanonicalPath(), newComp, System.currentTimeMillis()); app.build(true); } catch (Exception ex) { ex.printStackTrace(); } } }