2015-06-25 3 views
3

Недавно я перенес проект из Maven в Gradle (IE: заменил файл pom.xml на файл build.gradle). Поскольку у моей компании все еще есть несколько проектов Maven вниз по течению, которые зависят от нее, мы должны продолжать публиковать файл pom вместе с JAR класса, source и javadoc в наш репозиторий Nexus, чтобы нисходящие проекты все еще могли использовать этот проект как зависимость от Maven. Это то, что для плагина «maven-publish» для Gradle. Вот что мой файл build.gradle выглядит с конфигурациями для Maven-плагин публиковать:Плагин Gradle 'maven-publish' с ошибкой «unmappable character for encoding»

apply plugin: 'java' 
apply plugin: 'maven-publish' 

group = 'com.my.company' 
version = 'myProduct-SNAPSHOT' 

repositories { 
    mavenLocal() 
    maven { url 'http://nexus.my.company.net/nexus/content/repositories/build-test-release' } 
    maven { url 'http://nexus.my.company.net/nexus/content/repositories/build-test-snapshot' } 
    maven { url 'http://nexus.my.company.net/nexus/content/repositories/central' } 
    maven { url 'http://nexus.my.company.net/nexus/content/repositories/thirdparty' } 
} 

dependencies { 
    // Stuff 
} 

sourceSets { 
    main { 
     // Stuff 
    } 
} 

task sourcesJar (type: Jar) { 
    classifier = 'sources' 
    from sourceSets.main.allJava 
} 

task javadocJar (type: Jar, dependsOn: javadoc) { 
    classifier = 'javadoc' 
    from javadoc.destinationDir 
} 

publishing { 
    publications { 
     mavenJars(MavenPublication) { 

      // Classes 
      from components.java 

      // Sources 
      artifact(sourcesJar) { 
       classifier = 'sources' 
      } 

      // Javadoc 
      artifact(javadocJar) { 
       classifier = 'javadoc' 
      } 
     } 
    } 
    repositories { 
     maven { 
      url 'http://nexus.my.company.net/nexus/content/repositories/build-test-snapshot' 
      credentials { 
       username 'user' 
       password 'password' 
      } 
     } 
    } 
} 

Это создает Gradle «опубликовать» задачу, которая будет генерировать нужный файл pom.xml, а также класс, источник , и Javadoc JAR. Как только это будет завершено, он опубликует банки в хранилище Nexus «build-test-snapshot».

Это прекрасно работает на моей машине, а также на наших серверах сборки и большинстве моих коллег. Тем не менее, некоторые сотрудники жалуются, потому что «gradlew опубликовать» команду (обратите внимание, что Gradle 2,4 обертка была включена с проектом) не удается на них с ошибками, подобные этим:

C:\Users\user\Perforce\WORKSPACE\project\src\main\java\com\my\company\test\randomizati 
on\RandomHelper.java:18: error: unmappable character for encoding Cp1252 
    private static final String NON_ENGLISH_CHARACTERS = "1234567890─Ç─?─é─â─ä─à─å─ç─ê─ë─è─ï─î─?─Ä─?─?─æ─Æ─ô─ö─ò─û─ù─ÿ─Ö 
─Ü─¢─£─?─₧─ƒ─á─í─ó─ú─ñ─Ñ─ª─º─¿─⌐─¬─½─¼─¡─«─»─░─▒─▓─│─┤─╡─╢─╖─╕─╣─║─╗─╝─╜─╛─┐┼Ç┼?┼é┼â┼ä┼à┼å┼ç┼ê┼ë┼è┼ï┼î┼?┼Ä┼?┼?┼æ┼Æ┼ô┼ö┼ò 
┼û┼ù┼ÿ┼Ö┼Ü┼¢┼£┼?┼₧┼ƒ┼á┼í┼ó┼ú┼ñ┼Ñ┼ª┼º┼¿┼⌐┼¬┼½┼¼┼¡┼«┼»┼░┼▒┼▓┼│┼┤┼╡┼╢┼╖┼╕┼╣┼║┼╗┼╝┼╜┼╛┼┐╞Ç╞?╞é╞â╞ä╞à╞å╞ç╞ê╞ë╞è╞ï╞î╞?╞Ä╞?╞Æ╞á 
╞í╞»╟?╟Ä╟?╟?╟æ╟Æ╟ô╟ö╟ò╟û╟ù╟ÿ╟Ö╟Ü╟¢╟£╟║╟╗╟╝╟╜╟╛╟┐├Ç├?├é├â├ä├à├å├ç├ê├ë├è├ï├î├?├Ä├?├?├æ├Æ├ô├ö├ò├û├ù├ÿ├Ö├Ü├¢├£├?├₧├ƒ├á├í├ó├ú 
äåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ&-.*$"; 

Интересно, что Команда «gradlew build» (которая компилирует проект с использованием javac) отлично работает на всех машинах. Это команда «gradlew publish», которая имеет проблемы на некоторых машинах (либо прохождение, либо отказ на Mac и Windows).

Я не могу сказать, какое ключевое различие здесь, но я подозреваю, что у затронутых пользователей неверно сконфигурированы их клиенты Perforce (нет указанных P4CHARSET) и все файлы проектов синхронизируются с их машинами с кодировкой по умолчанию. Мне непонятно, как проверить, какая кодировка Perforce используется при синхронизации, так что это всего лишь теория. Насколько я понимаю, даже если они исправляют свои конфигурации, им все равно придется уничтожить их призывников и снова загрузить все с сервера Perforce, чтобы получить все файлы с правильной кодировкой (utf16le-bom).

Независимо от любых проблем, связанных с Perforce, вина падает на меня, так как я тот, кто первым переключил нас на Gradle. Если есть способ настроить плагин maven-publish для решения проблемы, я бы предпочел сделать это. Если javac может скомпилировать нестандартные символы из этих файлов в классы, то нет причин, по которым плагин не может их прочитать и генерировать javadoc для них, правильно? Может быть, нужно явно указать, какую кодировку использовать?

Я уже пробовал играть с опцией -Dfile.encoding = x-UTF-16LE-BOM в JAVA_OPTS и GRADLE_OPTS (это не имело значения). Я также нашел следующий фрагмент кода, используемого для указания кодировки для задач «Compile» в Gradle:

tasks.withType(Compile) { 
    options.encoding = 'x-UTF-16LE-BOM' 
} 

К сожалению, это для задач «компилировать», и проект уже успешно компиляцией. Я не уверен, какие типы задач генерирует плагин maven-publish, поэтому я не знаю, как применять этот подход для этих задач (возможно ли это?).

Что еще я могу попытаться отключить плагин Gradle maven-publish по сравнению с файловыми кодировками?

ответ

1

После погружения в API Gradle я пришел с этим:

// Force character encoding in case the workspace was not set up correctly 
tasks.withType(Javadoc) { 
    options.encoding = 'x-UTF-16LE-BOM' 
} 

Это решило проблему на машинах, которые были ранее неудовлетворительными с ошибками кодирования при запуске «gradlew опубликовать».

Примечание: Для большинства случаев использования options.encoding должен быть установлен в UTF8, а не в формате x-UTF-16LE.

+0

Это решило мою проблему с 'tasks.withType (Javadoc) { options.encoding =' UTF-8 ' }' в корне. Благодарю. –

Смежные вопросы