Search code examples
apache-flexintellij-ideaswc

Building a SWC from IntelliJ Idea without resorting to ant?


First, here's what I want to do:

* Compile my library code into a SWC
* Do not staticly link the Flex framework

At first, I tried just setting up a Flex module, clicking the "library" and "use framework as an RSL" buttons. This however doesn't compile any of my code into the SWC, and it basically just compiles a new SWC of the entire Flex framework, all resources and classes included.

Then, I managed to get my classes into the build using a custom compiler config, but it still includes the few Flex classes that I reference in my library code.

Finally, I figured I could use the custom flex-config.xml file, remove the parent reference to the library using <library-path append="false"></library-path> and then using a custom command line parameter (and also from ant), add -compiler.external-library-path references to the SDK and PlayerGlobal.swc. This should probably work, but Idea won't let me set command line parameters when I'm using a custom config file :'(

Any suggestions are greatly appreciated!


Solution

  • OK, Through help on the Idea forums, much googling, and random experimentation, here's what worked. Take careful note that some parameters are specified like "{name}" and some are "${name}". No, I don't know why :-/

    <!-- Specifies the minimum player version that will run the compiled SWF. -->
    <!-- 9.0.124 is the April 2008 security release -->
    <target-player>9.0.124</target-player>
    
    <compiler>
    
        <source-path>
            <path-element>src</path-element>
        </source-path>
    
        <incremental>true</incremental>
    
        <keep-as3-metadata append="true">
            <name>Inject</name>
            <name>InjectInto</name>
            <name>InjectIntoContents</name>
            <name>Singleton</name>
            <name>PostConstruct</name>
        </keep-as3-metadata>
    
        <!-- Remove the "include" library path. -->
        <library-path append="false"></library-path>
    
        <!-- Set up an "external library" path that is compiled against but not linked. -->
        <!-- SWCs not used for SP are left in but commented out to make it easier to copy this script -->
        <external-library-path>
            <path-element>${flexlib}/libs/player/{targetPlayerMajorVersion}/playerglobal.swc</path-element>
            <path-element>${flexlib}/libs/framework.swc</path-element>
            <!--<path-element>${flexlib}/libs/flex.swc</path-element>-->
            <!--<path-element>${flexlib}/libs/rpc.swc</path-element>-->
            <!--<path-element>${flexlib}/libs/utilities.swc</path-element>-->
            <!--<path-element>${flexlib}/libs/datavisualization.swc</path-element>-->
        </external-library-path>
    
    </compiler>
    
    <static-link-runtime-shared-libraries>false</static-link-runtime-shared-libraries>
    
    <include-classes>
        <class>net.expantra.smartypants.impl.InjectorImpl</class>
    </include-classes>
    
    <output>./build/SmartyPants-IOC.swc</output>