Как опубликовать maven-артефакт в jCenter

Written by elwood

Недавно я случайным образом написал плагин для MyBatis. Написал тесты, readme, все дела. И даже прикрутил бейдж от travis-ci. Но самое главное ещё только предстояло сделать. А именно – запилить этот мейвеновский пакет в какой-нибудь публичный репозиторий. Я никогда ещё этого не делал, и сначала было пошёл смотреть, как опубликовать свой артефакт на Maven Central. Нашёл статью “Публикация артефакта в Maven Central через Sonatype OSS Repository Hosting Service”, полистал, и призадумался. Что-то всё как-то больно сложно. И вспомнил, что gretty, один из моих любимых плагинов для gradle, хостит свои релизы на jcenter. Решил попробовать – и вуаля ! Всё получилось. Единственный затык был связан с тем, что я заливал файлы в неправильный путь. И ещё пришлось догадаться сделать pom-файл отдельно, а не надеяться на парсер джарника. Чтобы вы не повторяли моих ошибок и туплений, напишу краткий гайд о том, как опубликовать простой обычный артефакт в jcenter.

  1. Сходите на https://bintray.com и зарегистрируйтесь
  2. В интерфейсе кабинета создайте свою организацию, внутри неё – maven репозиторий (с произвольным названием), далее внутри репозитория создайте пакет, а внутри пакета – версию. Версия должна быть release, то есть не содержать суффикса “SNAPSHOT”
  3. Подготовьте 3 файла:
    • project-1.0.jar – этот файл обычно делается командой mvn clean package
    • project-1.0-sources.jar – здесь можно попробовать команду mvn source:jar
    • project-1.0.pom – а этот файл делается простым переименованием вашего pom.xml
  4. В контексте версии в веб-интерфейсе перейтиде к странице загрузки файлов. Выберите сразу 3 файла и перетащите их в броузер. Вы должны будете увидеть что-то типа этого:

    bintray-uploading

    Жмите Accept, и пути будут выставлены корректно, согласно координатам, указанным в вашем pom-файле.

  5. Теперь bintray предложит опубликовать загруженные артефакты. Не отказывайтесь.
  6. Далее возвращаемся к версии, наводим мышку на Maven Central, и выбираем опцию Synchronize with jCenter. Если всё сделано правильно, то система примет этот запрос, и теперь остается некоторое время подождать, пока сотрудник jCenter рассмотрит его. Вам придет письмо на email и уведомление по внутренней почте.
  7. Артефакт успешно опубликован в jcenter и доступен для загрузки ! Теперь его можно просто брать и использовать, в мейвене :
    <repositories>
        <repository>
            <id>jcenter</id>
            <url>http://jcenter.bintray.com</url>
        </repository>
    </repositories>
     
    <dependencies>
        <dependency>
            <groupId>org.mybatis.scripting</groupId>
            <artifactId>mybatis-freemarker</artifactId>
            <version>1.1</version>
        </dependency>
    </dependencies>

    или в Gradle:

    repositories {
        jcenter()
    }
     
    dependencies {
        compile("org.mybatis.scripting:mybatis-freemarker:1.1")
    }

Далее в планах все-таки попробовать запилить свой пакет в Maven Central, по результатам постараюсь отписаться тоже.

UTF-8 в Cygwin

Written by elwood

Иногда бывает нужно выполнить команду в MinGW или Cygwin так, чтобы аргументы командной строки были переданы в правильной кодировке. Под правильной кодировкой, разумеется, я имею в виду UTF-8. Крайние версии как одного, так и другого продукта уже давно научились принимать и выводить русские символы, и на первый взгляд, всё с этим в порядке. Но при ближайшем рассмотрении оказывается, что не всё так гладко. Например, MinGW использует для всего кодировку Win-1251, и передать аргумент в программу в UTF-8 (для того, чтобы понять, в какой кодировке MinGW отправляет аргументы, пришлось написать отдельную java-аппликацию, которая просто писала в файл всё, что получает на вход). Конечно, если вы имеет доступ к коду вызываемой программы, то можете её оснастить конфигой, которая бы конвертировала входные параметры из Win-1251 в UTF-8. Но как быть с другими приложениями ? Конкретно меня интересовал cURL. К сожалению, мне не удалось сконфигурировать MinGW так, чтобы он работал корректно. Было бы классно, если бы в будущем это можно было сделать, а ещё лучше – чтобы это работало по умолчанию.

Зато Cygwin обрадовал. В нём даже всё заработало по умолчанию. Но тоже не обошлось без проблем. Если вводить команду руками целиком – всё хорошо. Но если попытаться вставить из буфера обмена, то результат будет зависеть от текущего языка ввода. Если это английский, то английский текст вставляется без проблем. Но в русском почему-то появляются артефакты [G. И наоборот – если язык ввода – русский, то русский текст вставляется нормально, а английский обильно перемежается теми же артефактами. Пример:

cygwin-bug

В итоге, окончательное решение так и не было найдено. При острой необходимости скопировать команду, в которой рядом английский и русский, приходится копировать по частям, или править вставленное.

Java. Всё за жизнь

Written by elwood

Пара маленьких относящихся к миру Java вещей, о которых можно упомянуть.

1. Недавно обнаружил страшный баг в крайней версии IDEA – отладчик частенько не срабатывал на брейпоинтах. Просто пропускал. Удалось даже написать программу для воспроизведения ошибки. См описание бага. Надеюсь, поправят быстро, т.к. отладчик это последняя надежа.

2. Нашел официальное подтверждение хаку с заменой класса локальной версией. Действительно, JVM даёт приоритет тем класс-файлам, которые лежат в элементах ClassPath, описанных ранее. То есть если у вас есть 2 джарника и в каждом из них один и тот же класс, то будет использован тот, который был записан в -cp первым. Так что можно невозбранно форкать классы из либ и патчить их как вздумается. Главное не забыть прописать при запуске classpath в нужном порядке.

Пруф
Тред на stackoverflow

В WAR-архивах это тоже работает, но там в приоритете /WEB-INF/classes, а джарники по идее все равноправны. Но даже приоритет /WEB-INF/classes формально нигде не определён, всё зависит от деталей реализации сервлет-контейнера. Впрочем, в самых популярных это работает.

3. Как поставить бряк на конкретное исключение ?

http://stackoverflow.com/questions/6408596/intellij-idea-how-can-i-create-an-exception-breakpoint-that-stops-on-all-except