barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

понедельник, 28 января 2013 г.

WSO2 ESB 4.5.1: проблема обрезки XML, читаемых с помощью VFS + ApplicationXMLBuilder

Проблема:

Есть прокси сервис VFS->HTTP, читающий XML-сообщения из файлов и отправляющий их по HTTP. Сообщения в файлах лежат без SOAP-обертки, соответственно, ContentType в параметрах сервиса установлен в:
<parameter name="transport.vfs.ContentType">application/xml</parameter>
(в axis2.xml этом типу содержимого соотнесен билдер org.apache.axis2.builder.ApplicationXMLBuilder).
Проблема заключается в том, что объемные сообщение отправляются обрезанными: может не хватать нескольких тегов в конце, в дополнение к чему содержимое последнего из все же переданных тегов также может быть обрезано. При этом корректность XML соблюдается, т.е. содержимое обрезается, а закрывающие теги все равно есть. 
Если класть в файлы сообщения сразу в SOAP-обертке, используя
<parameter name="transport.vfs.ContentType">text/xml</parameter>
, ситуация не меняется.
При этом наблюдается интересная особенность: если логировать сообщение перед отправкой (используя лог-медиатор с уровнем full), то оно и в лог пишется целиком, и на конечный сервис отправляется без обрезки.
Если же попытаться до отправки сообщение не логировать, а логировать после <send/>, то ловим странное:
org.apache.axiom.om.OMException: Parser has already reached end of the document. No siblings found
at org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.java:338)
at org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenIterator.java:36)
at org.apache.axiom.om.impl.traverse.OMAbstractIterator.hasNext(OMAbstractIterator.java:58)
... at org.apache.axiom.om.impl.llom.OMElementImpl.toString(OMElementImpl.java:988)
at java.lang.String.valueOf(String.java:2854)
at java.lang.StringBuffer.append(StringBuffer.java:232)
at org.apache.synapse.mediators.builtin.LogMediator.getFullLogMessage(LogMediator.java:184)
... at org.apache.synapse.transport.vfs.VFSTransportListener.processFile(VFSTransportListener.java:481)
...
Workaround:

Видимо, проблема связана с какой-то "ленивой" загрузкой входящего XML. При логировании сообщения (и, как оказалось, также при других операциях над сообщением, например,  при выполнении над ним XPath) он все-таки загружается полностью. А вот при выполнении <send/> (а также при любых операциях после него) - нет.
В очередной раз копаться в исходниках и отлаживать ситуацию времени не было. Поэтому нашел простой (временный) workaround для проблемы: перед отправкой обращаться к содержимому сообщения (используя несложный xpath в property-медиаторе):
 <property action="set" name="dummyprop" scope="default" type="STRING" expression="count($body/*)"/>


WSO2 ESB: валидация запросов и ответов по схеме, импортирующей другие схемы

Валидация в WSO2 ESB выполняется Validate-медиатором. Вот только документация, имеющаяся  по нему  на сайте WSO2, неполная: в ней ни слова не говорится о работе с импортируемыми схемами.
В действительности, настройка валидации по схеме, импортирующей другие схемы, аналогична настройке публикации WSDL, ссылающейся на внешние схемы (я про неё писал когда-то очень-очень давно). Ниже я опишу XML-конфигурацию медиатора Validate.
Пусть схема (назовем её MainSchema.xsd), по которой необходимо осуществить валидацию всего тела запроса к сервису, импортирует 2 другие схемы по относительным URL`ам:
  • Service?xsd=ImportedSchema1.xsd
  • Service?xsd=ImportedSchema2.xsd
Во-первых, все 3 схемы нужно разместить в реестре (во встроенном или подключенном GREG). Я их разместил в коллекции conf:/services/TestValidate/.
После этого во входящую цепочку медиации сервиса нужно поместить такой validate-медиатор:
<validate>
<schema key="conf:/services/TestValidate/MainSchema.xsd"/>
<resource location="Service?xsd=ImportedSchema1.xsd"
key="conf:/services/TestValidate/ImportedSchema1.xsd"/>
<resource location="Service?xsd=ImportedSchema2.xsd"
key="conf:/services/TestValidate/ImportedSchema2.xsd"/>
<on-fail>
<!-- Последовательность, выполняемая при ошибке валидации-->
</on-fail>
</validate>
<!-- Последовательность, выполняемая при успешной валидации -->

Как видно, тегами <resource/> устанавливается соответствие между URL`ами импорта и путями к соответствующим импортируемым схемам в реестре. В случае, если импортируемые схемы, в свою очередь, импортируют другие схемы (или перекрестно уже имеющиеся) - их все нужно перечислить как ресурсы (предварительно разместив в реестре).
Атрибутом "source" у тега <validate/> можно задать xpath, выбирающие узлы, подлежащие валидации (в моем случае, при отсутствии этого атрибута, валидируется все тело сообщения).

суббота, 26 января 2013 г.

base64 кодирование / декодирование файлов из командной строки

Собственно утилитка под Win для base64-кодирования / декодирования файлов из командной строки: http://www.fourmilab.ch/webtools/base64/.

ActiveMQ: вопросы вместо русских букв в веб-админке

Проблема:

При просмотре содержимого сообщений в очереди через родную веб-админку ActiveeMQ (страница admin/message.jsp) вместо русских символов выводятся знаки вопроса.

Решение:

Открыть эту самую jsp-шку (webapps/admin/message.jsp относительно корня установки ActiveMQ) и добавить в начало файла:
<%@ page language="java"
         contentType="text/html; charset=cp1251"
         pageEncoding="cp1251"%>

Java: вывод кириллицы в консоль Win

Чтобы запускаемые из cmd java-программы выводили в неё читаемые русские символы вместо кракозябр, нужно:
  1. Сменить кодовую страницу консоли на cp1251, выполнив:
    chcp 1251
    Для различных Java-серверов (Tomcat, WSO2 и пр.) можно добавить эту команду в стартовый скрипт.
  2. Сменить шрифт консоли на 'Lucida Console' (Правой кнопкой по заголовку окна -> Свойства -> Шрифт либо Умолчания -> Шрифт, чтобы поменять шрифт по-умолчанию, т.е. для всех новых окон cmd)

jQuery: блокировка элементов управления

Когда-то писал про блокировку элементов страницы при помощи dojo, теперь возникла аналогичная задача, но в jQuery. Здесь поможет плагин BlockUI, он имеет множество параметров для настройки. Единственное, что показалось мне неудобным (не помню, было ли поведение dojo-виджета таким, или нет): overlay блокирует клики (и вообще весь интерактив) по объектам внутри контейнера, к которому применен,  но не клики по самом контейнеру. Т.е. если у нас есть какая-то кнопка (просто <button/> или же <div/> с обработчиком onClick), и мы к ней применили метод block(), кликнуть по ней все равно будет можно. Так что приходится в обработчике клика проверять дополнительно, заблокирована ли кнопка, или нет. Надо будет как-нибудь сделать бранч на гитхабе и допилить этот плагин =)

понедельник, 21 января 2013 г.

away3d 4.0: ObjectContainer3D и mouseEnabled

Установка у объекта ObjectContainer3D свойства mouseEnabled к сожалению не дает никакого эффекта: контейнер по-прежнему не может принимать события MouseEvent3D. Поэтому навешивать обработчики событий MouseEvent3D надо не на сам контейнер, а на его потомков (если они сами не являются контейнерами). Для этого, например, можно переопределить метод ObjectContainer3D.addEventListener() так:
override public function addEventListener(
type : String,
listener : Function,
useCapture : Boolean = false,
priority : int = 0,
useWeakReference : Boolean = false) : void
{
if(type == MouseEvent3D.CLICK
|| type == MouseEvent3D.DOUBLE_CLICK
|| type == MouseEvent3D.MOUSE_DOWN
|| type == MouseEvent3D.MOUSE_MOVE
|| type == MouseEvent3D.MOUSE_OUT
|| type == MouseEvent3D.MOUSE_OVER
|| type == MouseEvent3D.MOUSE_UP
|| type == MouseEvent3D.MOUSE_WHEEL
)
for(var i:uint=0;i<this.numChildren;i++)
{
var child:ObjectContainer3D = this.getChildAt(i);
child.addEventListener(
type,
listener,
useCapture,
priority,
useWeakReference
);
}
}
У потомков при этом, естественно, должно быть установлено свойство  mouseEnabled = true.

воскресенье, 20 января 2013 г.

IE 9: почему window.open() возвращает null?

Проблема:

Предыстория такая. Есть сайтик на localhost, использующий авторизацию через вк`ашное OpenAPI. Работает авторизация везде, кроме IE. В IE, как и в других браузерах, по нажатию кнопки входа вызывается VK.Auth.login(), открывающая popup, который запрашивает доступ подключенного сайта к информации с ВК:


После того, как юзер нажмет "Разрешить" или "Отмена", или просто закроет popup, должен вызваться callback, переданный в VK.Auth.login() единственным параметром. Во всех браузерах все работет как нужно, а вот IE вызывает callback, не дожидаясь каких-либо действий с popup`ом.
После отладки выяснилось, что причина такого поведения кромется в том, что IE по какой-то причине при вызове window.open() возвращает ull вместо объекта, описывающего открытое окно.

Причина:

Причина крылась в том, что localhost и vk.com расположены в разных зонах: первый - в зоне "Местная интрасеть", второй - "Интернет", и открытие popup`а является в таком случае межзонным. 

Решение:

Вариант 1: отключить защищенный режим для зоны "Интернет", сняв соотв. галочку:


Вариант 2: убрать localhost из зоны "Местная интрасеть" снятием галочки:


Тут правда мы лишаемся некоторых ништяков, например, возможности использовать объект "console" в JS-скриптах.

пятница, 18 января 2013 г.

WSO2 ESB: исключение "com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog" при получении ответа конечного сервиса

Проблема:

Ситуация такая: некоторое сообщение шлется из прокси-сервиса А на одном экземпляре WSO2 ESB на прокси-сервис Б, развернутый на другом экземпляре WSO2. При обработке ответа  от сервиса Б сервис А валится с ошибкой:
com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog
при этом в логах сервиса Б сообщение никаких "-" в прологе не содержит, и выглядит очень даже корректно.

Причина:

На самом деле сервис Б выдает multipart-ответ вида:
HTTP/1.1 200 OK
Content-Type: multipart/related; boundary="MIMEBoundary_68536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9"; type="application/xop+xml"; start="<0.78536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9@apache.org>"; start-info="text/xml"
Accept-Encoding: gzip,deflate
Host: 10.24.12.132:8280
Date: Fri, 18 Jan 2013 15:40:19 GMT
Server: Synapse-HttpComponents-NIO
Transfer-Encoding: chunked
Connection: Keep-Alive

--MIMEBoundary_68536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <0.78536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9@apache.org>

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><!--...--></soapenv:Body></soapenv:Envelope>
--MIMEBoundary_68536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9--
Причина такого ответа в том, что на втором сервере включена MTOM-оптимизация. А вот на первом она выключена, поэтому он оптимизированных ответов не понимает.

Решение:

Т.к. для данного конкретного сервиса (особенно для его ответов), оптимизация была не нужна, я её выключил установкой свойства:
<property name="enableMTOM" value="false" scope="axis2"/>
в цепочке медиации сервиса Б перед отправкой ответа (в out / faultSequence).
Можно также отключить MTOM параметром сервиса:
<parameter name="enableMTOM">false</parameter>

четверг, 17 января 2013 г.

WSO2 ESB: исключение java.util.NoSuchElementException при отправке прокси-сервисом сообщения на конечную точку

Такое исключение, возникающее при попытке шиной отправить сообщение на конечную точку:
ERROR {org.apache.axis2.transport.base.threads.NativeWorkerPool} -  Uncaught exception {org.apache.axis2.transport.base.threads.NativeWorkerPool}
java.util.NoSuchElementException
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1128)
at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225)
at org.apache.axiom.util.stax.dialect.DisallowDoctypeDeclStreamReaderWrapper.next(DisallowDoctypeDeclStreamReaderWrapper.java:34)
...
org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
может быть вызвано полным отсутствием ответа сервиса (т.е. не пустым телом HTTP, а отсутствием даже заголовков). Тут как обычно с WSO2, по исключению вовсе не очевидна его причина.

Netbeans 7.2.1: Checkstyle-плагин

Установка в Netbeans 7.2.1 Checkstyle-плагина с возможностью подключения своих стилей:
  1. Tools -> Plugins -> Settings -> Add
  2. Добавить новый центр обновлений "Software Quality Environment" с URL "http://deadlock.netbeans.org/hudson/job/sqe/lastStableBuild/artifact/build/full-sqe-updatecenter/updates.xml"
  3. После этого вернуться на вкладку "Available Plugins", где выбрать и установить "Checkstyle"
  4. Свои файлы стилей подключаются в Tools -> Options -> Quality -> Checkstyle

WSO2 ESB: откат JMS-транзакции в outSequence

Если сервис использует транзакцию при чтении входящей JMS-очереди:
<parameter name="transport.jms.SessionTransacted">true</parameter>
откатить её установкой свойства:
<property action="set" name="SET_ROLLBACK_ONLY"
scope="axis2" type="STRING" value="true"/> 
можно только в inSequence / faultSequence, но не в outSequence (там установка свойства эффекта не дает никакого, т.к. на момент начала outSequence танзакция уже откачена / закоммичена). А жаль. 

среда, 16 января 2013 г.

php: определение ОС сервера

Вариантов определения ОС сервера (win/unix) несколько:
  1. Константа PHP_OS. Для Win (по крайней мере XP и 7) равна 'WINNT', для Linux - 'Linux' и т.п.
  2. php_uname() - дает более полную информацию об ОС строкой 
  3. posix_uname() - выдает примерно ту же информацию массивом

Maven: сборка без запуска тестов

Для того, чтобы пропустить выполнение тестов при сборке, нужно указать свойство maven.test.skip=true, например:
mvn clean package -Dmaven.test.skip=true

вторник, 15 января 2013 г.

Maven: создание тестового окружения для тестирования war-проекта, использующего overlays при сборке

Задача:

Есть проект, собираемый maven`ом, а точнее, maven-war-plugin`ом. У проекта есть несколько zip-зависимостей с ресурсами, распаковываемыми в WEB-INF/classes при создании war`ника (при помощи overlays). Задача состоит в том, чтобы при запуске unit-тестов также распаковывать эти зависимости куда-нибудь в тестовый classpath (например, в target/test-classes), чтобы для тестов формировалось окружение, аналогичное тому, что будет после запаковки в war.

Решение:

Для копирования ресурсов для тестов (и не только), можно воспользоваться maven-resources-plugin`ом. Вот только он умеет копировать файлы только из папки А в папку В, и про зависимости ничего не знает. Для работы с зависимостями есть плагин maven-dependency-plugin, а для распаковки ресурсов из зависимостей подойдет его гол "unpack". В моем случае он должен отрабатывать на фазе "process-test-resources" (когда тестовые классы уже скомпилированы и помещены в ${basedir}/target/test-classes). В итоге фрагмент pom`ки, отвечающий за распаковку ресурсов из zip-зависимостей, выглядит так:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
 <execution>
<id>copy-war-or-zip-resources-for-test</id>
<phase>process-test-resources</phase>
<goals>
 <goal>unpack</goal>
</goals>
<configuration>
 <outputDirectory>${basedir}/target/test-classes</outputDirectory>
 <artifactItems>
<artifactItem>
 <groupId>my.dep.group.id</groupId>
 <artifactId>artifact-id</artifactId>
 <classifier>resources</classifier>
 <type>zip</type>
</artifactItem>
<!-- ... -->
 </artifactItems>
 <excludes>my-exluded.properties</excludes>  
</configuration>
 </execution>
</executions>
</plugin>    
Правда, гибкость в данном случае, по сравнению с overlays, теряется, т.к. overlays позволяет указывать исключения для каждой зависимости, а  unpack - только для всех сразу.
PS А maven-resources-plugin пойдет для использования в качестве замены webResources в maven-war-plugin. Использовать его нужно на той же фазе process-test-resources.

wamp: установка pear-пакетов с помощью pyrus

Попробовал установить пакет pear/Mail с помощью Pyrus:
php pyrus.phar install pear/Mail
Однако получил:
You must compile PHP with the following extensions enabled:
sqlite3
or install the necessary extensions for your distribution.
При этом в php.ini, используемом wamp`ом, расширение sqlite3 включено:
extension=php_sqlite3.dll
Проблема оказалась вот в чем. При запуске из cmd php использует не тот php.ini, что под апачем : php.exe использует \bin\php\php5.3.10\php.ini относительно директории установки wamp`а (узнать это можно просто, командой "php --ini"), а под апачем - bin\apache\Apache2.2.21\bin\php.ini. Т.е. для запуска pyrus нужно внести изменения именно в \bin\php\php5.3.10\php.ini (или указать путь в апачевскому php.ini с помощью опции -c).

DQL: аналог SQL`ных LITMIT / TOP

SELECT * FROM dm_folder ENABLE (RETURN_TOP 1)

пятница, 11 января 2013 г.

jaxws-maven-plugin 2.1 и "unmappable character for encoding UTF-8"

Проблема:

В проекте используется jaxws-maven-plugin версии 2.1, генерирующий классы по WSDL. В WSDL и импортируемой в неё схеме есть русские буквы в аннотациях. При сборке проекта при компиляции возникают ошибки "unmappable character for encoding UTF-8" при попытке скомпилировать сгенерированные классы. ОС - Windows, кодировка исходников проекта - UTF-8.

Причина:

Проект использует кодировку исходников UTF-8. wsimport генерирует исходники в cp1251 (в системной кодировке), причем они содержат русские символы в комментариях, пришедшие туда из аннотаций к XSD-схеме.
В отличие от wsimport`а версии 2.2, опции "encoding", позволяющей задать кодировку целевых файлов, нет. Нет такой опции и у используемого им xjc (эту опцию можно было бы передать ему через опцию -B<xjcoption> wsimport`а).

Решение:

Как ни странно, помогла установка параметра xnocompile в false:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<!-- ... -->
<configuration>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
<xnocompile>false</xnocompile>
<verbose>true</verbose>
<extension>true</extension>
<catalog>${basedir}/src/jax-ws-catalog.xml</catalog>
</configuration>
</plugin>
Также xnocompile можно установить в false не в конфигурации всего плагина, а внутри конфигурации execution`а, эффект тот же:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<executions>
 <execution>
<goals>
 <goal>wsimport</goal>
</goals>
<configuration>
 <xnocompile>false</xnocompile>
 <!-- ... -->
</configuration>
<!-- ... -->
 </execution>
</executions>
<!-- ... -->
</plugin>
Генерируемые исходники все также в cp1251, но компиляция проходит. Есть идея, что это происходит потому, что сгенерированные файлы компилируются сразу wsimport`ом, и в этом случае компилятор не обращает внимание на кодировку файлов проекта (посколько о ней не знает), а читает исходники в системной кодировке, в какой они и действительно закодированы.

четверг, 10 января 2013 г.

maven и jaxws-maven-plugin 2.2: проблема со сборкой на JDK 1.6.

Проблема:

Имеется проект, собираемый maven`ом с использованием jaxws-maven-plugin версии 2.2. Проект без проблем собирается с использованием JDK 1.7, однако при попытке собрать его на JDK 1.6 возникает ошибка:
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project Fileadapter-ECM-WS: Compilation failure: Compilation failure:
symbol  : constructor Service(java.net.URL,javax.xml.namespace.QName,javax.xml.ws.WebServiceFeature[])
location: class javax.xml.ws.Service
Добавление в проект зависимости от jaxws-api 2.2:
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.2.8</version>
<scope>compile</scope>  
</dependency>

не помогает, т.к. при компиляции используется jaxws-api из JDK, а там, в случае JDK 1.6, находится версия jaxws-api 2.1.

Решение:

Уже когда-то писал про аналогичную проблему (http://barbitoff.blogspot.ru/2012/01/cannot-find-symbol-symbol-constructor.html), правда тогда собирал ant`ом, а не maven`ом. 
Решения, вобщем-то, два. Первое - перейти на jaxws-maven-plugin версии 2.1. Второе - использовать endorsed-механизм, чтобы заменить версию jaxws-api при сборке (если мы знаем, что в целевой среде, где будет выполняться приложение, будет jaxws-api версии 2.2 и реализующая его имплементация). Делается это следующим образом:
1) Во-первых, в проекте необходимо создать папку для endorsed-библиотек. Я создал её в корне проекта (на одном уровне с pom.xml) и называл "endorsed".
2) В созданную папку поместить jar-ник jaxws-api версии 2.2, скачать его можно тут.
3) Настроить maven-compiler-plugin на использование нашей endorsed-папки:
<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <compilerArguments>
            <endorseddirs>${basedir}/endorsed</endorseddirs>
          </compilerArguments>
        </configuration>
      </plugin>
      <!-- ... -->
</build>
PS Конечно, правильнее с точки зрения философии maven будет не класть заранее jar-ник в папку endorsed, а размещать эту папку в директории сборки и копировать туда jar-ник как зависимость с помощью dependency-плагина уже при сборке.

axis2: проблема с "Unable to generate WSDL 1.1 for this service" при useOriginalwsdl=true

Проблема:

Есть axis2-сервис, в его services.xml установлено useOriginalwsdl=true. В директории /META-INF лежит wsdl-файл, название которого совпадает со значением атрибута "name" сервиса в services.xml (<service name="xxx">, файл называется соответственно xxx.wsdl). Однако, по запросу "?wsdl" вместо этого файла выдается ошибка:
<error><description>Unable to generate WSDL 1.1 for this service</description><reason>If you wish Axis2 to automatically generate the WSDL 1.1, then please set useOriginalwsdl as false in your services.xml</reason></error>
Решение:

В моем случае проблема оказалась в том, что имя сервиса в wsdl (<wsdl:service name="ууу">) отличалось от имени сервиса в services.xml (и, соответственно, от имени wsdl-файла).

четверг, 3 января 2013 г.

Использование fl.controls.* в Flash Builder - проекте

Задача:

Использовать в ActionScript-проекте во Flash Builder компоненты из пакета fl.controls.

Решение:

Сначала необходимо создать swc-библиотеку с нужными компонентами (для этого понадобится Flash Professional), а затем подключить её к Flash Builder-проекту.
Чтобы сделать первое, нужно:
1) Создать fla-проект в Flash Professional
2) Перетащить нужные компоненты из окна "Компоненты" в окно "Библиотека":
3) Экспортировать SWC. Для этого щелкнуть правой кнопкой мыши по любому из компонентов, перетащенных в библиотеку, и выбрать соотв. пункт меню:
4) Всё, теперь, когда создан SWC-файл, можно добавлять его путь сборки Flash Builder-проекта: