Category Archives: Tools

Как опубликовать 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

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

Трассировка в IDEA возобновляет другие потоки!

Written by elwood

Почему-то всегда считал, что если делать трассировку в отладчике (Step In, Step Over), то все остальные потоки в это время приостановлены, поскольку все потоки приостанавливаются при остановке на брейкпоинте. А оказалось, что это не так, и хотя IDEA действительно останавливает все потоки при попадании на точку останова, при дальнейшей трассировке между каждым следующим шагом вся JVM полностью возобновляется. Здесь чел тоже плачется и хочет режим, в котором бы трассировка не возобновляла остальные потоки. На что ребята из JetBrains пока что отвечают, что всё работает, как и должно, by design, и что это и есть правильный подход, т.к. в противном случае могут возникать дедлоки.

Мне кажется, что всё же опция отладки в таком режиме необходима, потому что иначе трассировать многопоточное приложение просто не имеет смысла. Буду надеяться, что фичу одобрят и добавят в будущем. А пока этого не случилось, приглашаю проголосовать за неё в трекере:

https://youtrack.jetbrains.com/issue/IDEA-43728