2012-01-22 4 views
7

Итак, у меня есть веб-приложение весны mvc, которое я построил в IntelliJ 9, используя maven.Как упаковать мои классы в .jar и все еще упаковать как войну?

Когда я побегать:

mvn clean install 

Он упаковывает все вверх в обоих .war файла и разобранном войны.

В моем макете проекта используется тип арки простейшего веб-приложения maven.

How can I have my classes compiled into a .jar file also? 

В настоящее время мои классы находятся в:

/target/myapp/WEB-INF/classes/ 

То, что я хочу, чтобы это скомпилировать мой код в .jar, как:

myapp-1.0.jar 

И что есть это в моей папке /target/myapp/WEB-INF/lib как и все мои другие банки.

Update

Я хочу, чтобы это было сделано с помощью Maven, не IntelliJ специфичны.

+0

Итак, в чем проблема с тем, чтобы классы WEB-INF/классов использовались в качестве баннера в WEB-INF/lib? – khmarbaise

+0

Во-первых, некоторые (тестирующие) инженеры часто забывают обновлять классы, когда вы говорите им обновить свой установленный webapp с помощью нового кода (чтобы сохранить конфигурацию). Легче иметь весь код в каталоге lib. – AndrewBourgeois

+0

@Blankman Я прочитал ваши вопросы о SO об обфускации веб-приложения. Можете ли вы предоставить процесс, который вы выполнили, или некоторые файлы конфигурации? Я могу генерировать запутанную банку и войну (без обфускации). Но я хочу создать войну с obf. банку в нем. – phoenix

ответ

2

Вы можете легко создать два артефакта - JAR и WAR.

Я не уверен, что преимущество в том, что ваши файлы .class в JAR в отличие от WEB-INF/classes. Оба сжимаются; JAR не будет обеспечивать дополнительное сжатие. Возможно, вы захотите повторно использовать эти .class-файлы в других приложениях. если это так, вы можете подумать о переносе этих классов Java в отдельный модуль и добавлении файла JAR, который вы создаете, так же, как и любой другой сторонний JAR в вашем файле WAR. Другие приложения легко смогут проверить JAR-файл из вашего репозитория и просто повторно использовать его. Эта компоновка лучше всего сделать, перемещая общие классы Java в отдельный репозиторий в вашей системе управления версиями.

+1

Я делаю это, потому что для выполнения proguard это требуется. – Blankman

+0

Ну, я хочу сделать это с помощью maven, поэтому я могу построить без intellij. – Blankman

+0

Как сказал duffymo, создание двух артефактов Maven - это путь: артефакт баннера, содержащий классы и артефакт войны, с зависимостью от артефакта банды. Обратите внимание, что зависимости ваших классов нужно перенести из pom.xml проекта войны в проект jar. –

-2

Тип упаковки задается «упаковки» метки в pom.xml (обычно помещаемых вполне на верхней части файла, вместе с артефактами идентификатором, версия и т.д. проекта.

Попробуйте найти

<packaging>war</packaging> 

в pom.xml и изменить его на

<packaging>jar</packaging> 
-2

ОК напиши команду Java в консоли

jar cvf myapp-1.0.jar * .class

+1

Вы слышали о Maven? Внимательно прочитайте вопрос! – panagdu

0

Не совсем ясно, какая польза от этого может быть, если содержимое WAR будет упаковано как JAR. Код, реализующий webapp, не будет работать без контекста развертывания WAR.

Это говорит о том, что совершенно необходимо подумать о том, как извлечь функциональное ядро ​​вашего кода в отдельный модуль Maven, который имеет JAR-упаковку и хороший Java API. Тогда ваш WAR-модуль может быть зависеть от этого и должен содержать только код, чтобы превратить этот Java API в веб-интерфейс.Преимущество этого заключается в том, что он также значительно улучшит способность вашего кода тестироваться (тестирование на JAR, безусловно, будет проще) и позволит вам думать с точки зрения наличия других клиентов одного и того же базового кода. Это может вас заинтересовать. Вам понадобится любой Java-код непосредственно в WAR? Может быть, может и нет. Есть несколько способов сделать это, в конце концов ...

+0

Создание JAR и WAR из модуля _same_ Maven - всего лишь плохая идея. Не делай этого. Подумайте о более четком разделении обязанностей. –

0

Самое простое решение в конфигурации для войны-плагин:

<attachClasses>true</attachClasses> 

, который сделает работу и создать отдельный файл фляги. Эта банка имеет классификатор «классы», который может быть изменен путем ввода в конфигурацию. Это может быть полезно, если вы разделили интеграционные тесты, которые полагаются на классифицированные из военного проекта, чтобы опубликовать их и сделать их доступными как зависимости. Это не имеет никакого отношения к разделению обязанностей.

+0

Если вы действительно хотите иметь отдельную банку и создать отдельный файл войны, который содержит банку (WEB-INF/lib), вам нужно сделать отдельные проекты с банкой и один с военным кодом, который имеет зависимость от банки , – khmarbaise

0

Runninng

mvn jar:jar install 

сделает банку, как если бы вы установили тип упаковки в банку. Без каких-либо изменений в вашем помпе.

Так что вам нужно только запустить эту строку, добавить ее в скрипт или добавить цель jar:jar в существующую сборку maven.

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