barbitoff programmer`s blog

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

среда, 17 апреля 2013 г.

Maven: unbind maven-deploy-plugin`а с фазы deploy

Делать unbind плагинов, которые жестко завязаны на фазы сборки, нельзя, но, в случае с maven-deploy-plugin, можно просто пропустить его выполнение, указав в конфигурации:
<plugin>
  <artifactId>maven-deploy-plugin</artifactId>
  <version>2.7</version>
  <configuration>
<skip>true</skip>
  </configuration>
</plugin>

Weblogic 10.3.5: ошибка "java.io.FileNotFoundException: class path resource [...] cannot be resolved to absolute file path because it does not reside in the file system: zip:.../_wl_cls_gen.jar!/..."

Проблема:

При деплое war-ника на Weblogic 10.3.5 (без распаковки) вываливается ошибка:
java.io.FileNotFoundException: class path resource [...] cannot be resolved to absolute file path because it does not reside in the file system: zip:.../_wl_cls_gen.jar!/...
при попытке разворачиваемого приложения прочитать какой-либо из файлов, размещенных в WEB-INF/classes. Деплою плагином weblogic-maven-plugin.

Причина:

Судя по форуму Oracle (https://forums.oracle.com/forums/thread.jspa?threadID=842786), это некая известная проблема Weblogic'а, связанная с тем, что он зачем-то при деплое все классы из WEB-INF/classes запаковывает в _wls_cls_gen.jar, после чего возникают проблемы, если приложение пытается прочитать какой-нибудь ресурс, который до этого располагался в WEB-INF/classes (этот ресурс получается дважды упакован: в _wls_cls_gen.jar, а затем и в war). 

Решение:

Workaround`ом для этой проблемы является развертывание приложений не в war-никах, а в распакованном виде. Т.к. weblogic-maven-plugin развернуть приложение в распакованном виде не может, то подойдет другой вариант: приложение в распакованном виде запаковать в EAR, и его уже задеплоить. Как собирать распакованные war-ники в EAR, я уже писал: http://barbitoff.blogspot.ru/2013/04/maven-ear-plugin-war-ear.html. Деплой ear-ника плагином weblogic-maven-plugin ничем не отличается от деплоя war.

maven-ear-plugin: включение WAR-ников в EAR в распакованном виде

Чтобы war-ники включались в EAR в распакованном (exploded) виде, нужно добавить тип "war" в параметр конфигурации unpackTypes:
  <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.6</version>
<configuration>
<unpackTypes>war</unpackTypes>
<version>6</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
</configuration>
  </plugin>
О том, как настроить распакову лишь некоторых war-ников, почитать можно тут: http://maven.apache.org/plugins/maven-ear-plugin/examples/unpacking-a-module.html

Pentaho: получение параметра трансформации из Java-кода step'а

String paramValue= getTrans().getVariable("paramValue");

вторник, 16 апреля 2013 г.

multiline grep

Собственно сабж:
pcregrep -M
Вообще очень удобная команда, имеет perl-совместимый синтаксис регулярных выражений. 

воскресенье, 14 апреля 2013 г.

dijit: отображения toolip`а ValidationTextBox`а рядом с другим элементом

Задача:

Сделать так, чтобы подсказка ValidationTextBox`а отображалась не рядом с ним, а рядом с другим dom-узлом. В моем случае я хочу вместо:
получить:

Решение:

Переопределить у ValidationTextBox метод displayMessage таким образом, чтобы методу Tooltip.show() он передавал не текущий узел, а некоторый другой. Этот самый "другой" узел я вынес в отдельное свойство:
define("my/form/ValidationTextBox", [
"dojo/_base/declare",
"dijit/form/ValidationTextBox",
"dijit/Tooltip"
], function(declare, ValidationTextBox, Tooltip){
var ValidationTextBoxExt;
return ValidationTextBoxExt = declare("my/form/ValidationTextBox", ValidationTextBox, {
/**
* Узел для отображения подсказки
*/
tooltipAroundNode: null,
  /** * Отображает подсказку рядом с текущим элементом, * если tooltipAroundNode = null, либо с заданным * в tooltipAroundNode элементом */
displayMessage: function(/*String*/ message){
if(message && this.focused){
Tooltip.show(message, this.tooltipAroundNode==null?this.domNode:this.tooltipAroundNode, this.tooltipPosition, !this.isLeftToRight());
}else{
Tooltip.hide(this.tooltipAroundNode==null?this.domNode:this.tooltipAroundNode);
}
} });
});
Теперь остается лишь где-то в коде установить этот самый tooltipAroundNode:
require(["dijit/registry"], function(registry) {
     registry.byId("my-input").set("tooltipAroundNode",registry.byId("my-button").domNode);
}

пятница, 12 апреля 2013 г.

Работа служб Windows с сетевыми дисками

Проблема:

Есть служба Windows (в моем случае - WSO2 ESB), настроенная на работу с некоторой папкой, размещенной на подключенном сетевом диске (mapped network drive). Диск подключался пользователем. Служба работает от "Local System Acount" и диска не видит (пишет, что "The file does not exists").

Решение:

Подключить диск от имени системы. Для этого:
2) Запускаем cmd от Администратора, переходим в папку Sysinternals, выполняем:
psexec -i -s cmd.exe
Откроется консоль от имени "nt authority\system".
3) Подключаем сетевой диск, при необходимости задавая данные для доступа к нему:
NET USE V: \\host\share <pass> /USER:<domain>\<user> /PERSISTENT:YES
Эта команда подключит сетевую шару \\host\share как сетевой диск V:, используя имя пользователя <domain>\<user> и пароль <pass> для доступа к этой шаре.
4) Всё, после этого служба будет иметь доступ к сетевому диску. Диск восстановится после перезагрузки благодаря ключу /PERSISTENT:YES.
5) Есди диск вдруг понадобилось отключить, нужно выполнить описанные выше манипуляции для входа в консоль "nt authority\system", после чего вызывать:
NET USE V: /DELETE
Спасибо http://stackoverflow.com/questions/182750/map-a-network-drive-to-be-used-by-a-service