Hi,

as there were several questions by different people in multiple threads, I'll 
try to aggregate the answers.


The current Falcon build requires some (normal) FlexSDK components (spark.swc, 
framework.swc, ...) as well as some Flash components (playerglobal.swc) the 
FlexASJS build also requires Air components (airglobal.swc). These have to be 
provided as Maven artifacts. Unfortunately the FlexSDK as well as the Adobe 
parts are not available as Maven artifacts.


For this I built the flex-sdk-converter which is able to hook itself into Maven 
as an extension and in case of needing any of these non-Maven artifacts, it 
downloads the SDK binary distributions unpacks them and converts their content 
into Maven artifacts. This all happens transparently to the Maven build.


But in order to do its magic this Maven extension needs to be loaded. The old 
option was to download the extension and copy it to the "${MAVEN_HOME}/lib/ext" 
directory. Since Maven 3.3.1 maven also looks into an ".mvn/extensions.xml" 
file (Which is relative to the directory the maven command is issued, not 
relative to the root pom.xml). This is the reason for requiring Maven 3.3.1. If 
you provide the needed artifacts 3.1.1 should also work. If not you would 
simply get errors from maven about not being able to resolve some of the 
dependencies. As seeing if the extension is operational was almost impossible, 
I made it output an Ascii-Art Flex logo on the command-line. So if you see 
that, the flex-sdk-converter is in place.


Now the next thing is that per default Maven looks in Maven Central for 
artifacts. All released Apache stuff released as Maven artifacts automatically 
goes there. Unfortunately SNAPSHOTS don't and we haven't released the 
flex-sdk-converter yet. In Maven you can provide additional Repositories to 
look for in the pom.xml so in general resolving of SNAPSHOT versions shouldn't 
be a problem. The problem is that Maven Extensions from the 
".mvn/extensions.xml" are resolved before Maven starts to read the root 
pom.xml. Therefore we can't tell it where to get the flex-sdk-converter from. 
That's were the "-s settings-template.xml" comes in. In Maven there is a 
".m2/settings.xml" which Maven looks for per default. If it's there this is 
used automatically. If you just installed/unpacked Maven, you will probably not 
have this file and Maven will stick to the defaults. In this file you can 
define further repositories which maven would look at. To make things simpler 
for you guys I wrote the "settings-template.xml" which contains all that is 
needed to use the flex-sdk-converter. You can copy this file into the ".m2" 
directory in your User-Home and name it "settings.xml" of you tell maven which 
settings.xml it should use. That's what the "-s settings.xml" is for.


Now to the last part of confusion: Why do we need to run 3 maven builds to 
build the falcon part?

Falcon is a pretty hefty mix of stuff with a lot of cyclic dependencies. So you 
need to build some parts in order to build others. While maven has no problem 
with this for normal dependencies, it is a problem if plugins in the build need 
other parts. In our case we need the flexjs-maven-plugin to build the externs 
and that needs the compiler ... both initially don't exist and therefore Maven 
will complain and die. I categorized the modules and found 3 partitions:

- Utils: This contains the flexjs-maven-plugin (The Maven plugin to build 
FlexJS applications), compiler-build-tools (Little helpers to annotate 
generated code, mainpulate code etc.), compiler-jburg-types (Contains only one 
class that JBurg needs to generate code)

- Compiler: compiler, compiler-jx, debugger, flex-compiler-oem (These contain 
all the parts of the compiler itself)

- Externs: All the extern modules which are built using the compiler and the 
maven plugin.

In order to support this I created 3 Maven profiles "utils", "compiler" and 
"externs". Each profile is activated by the "-P {profileName}".

I know this is not ideal but it's only temporary. The compiler-build-tools, and 
the compiler-jburg-types will not change much and as soon as they are released 
once, so I would opt for simply referencing the released versions and 
re-releasing them as soon as they are needed. The maven plugin will be moved to 
a separate git repo. Therefore the "utils" profile will not be needed anymore. 
I think in the end I will also be able to resolve the cycle between compiler 
and externs. In the end building should be as easy as "mvn clean install".


Hope that explains things a little better [😊]


And now I hope I'll manage to cross the finishing lines ... 4 examples to go ...


Chris

Reply via email to