Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
WAR файл в Java
WAR (Web Application Archive) — это архивный формат (по сути, ZIP файл с расширением .war), который используется для упаковки веб-приложений на Java (Servlets, JSP, REST API и другие) вместе со всеми необходимыми ресурсами, конфигурациями и зависимостями. WAR файлы развёртываются на веб-серверах и контейнерах приложений, таких как Apache Tomcat, JBoss, WebSphere и других.
Структура WAR файла
WAR архив имеет определённую иерархическую структуру:
MyApp.war
├── WEB-INF/
│ ├── web.xml # Дескриптор развёртывания (deployment descriptor)
│ ├── classes/ # Скомпилированные Java классы
│ │ └── com/example/
│ │ └── MyServlet.class
│ └── lib/ # JAR зависимости
│ ├── spring-core.jar
│ ├── mysql-connector.jar
│ └── ...
├── META-INF/
│ └── MANIFEST.MF
├── index.jsp # JSP страницы
├── css/
│ └── style.css # Статические ресурсы
├── js/
│ └── script.js
└── images/
└── logo.png
Компоненты WAR
1. WEB-INF директория
Основная директория приложения, недоступная напрямую из браузера:
<!-- web.xml — дескриптор развёртывания -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="3.1">
<!-- Конфигурация сервлетов -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!-- Фильтры -->
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>com.example.CorsFilter</filter-class>
</filter>
<!-- Context параметры -->
<context-param>
<param-name>app.version</param-name>
<param-value>1.0.0</param-value>
</context-param>
</web-app>
2. Скомпилированные классы
// Пример Servlet, который будет упакован в WAR
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h1>Hello World</h1>");
}
}
3. Зависимости в lib/
Все необходимые JAR файлы упаковываются в WEB-INF/lib/:
// Maven конфигурация для создания WAR
pom.xml:
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope> <!-- Контейнер предоставляет -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
Создание WAR файла
С помощью Maven
# pom.xml уже содержит <packaging>war</packaging>
mvn clean package
# Результат: target/myapp.war
С помощью Gradle
plugins {
id java
id war
}
task buildWar {
doLast {
jar {
archiveFileName = "myapp.war"
}
}
}
Программно
import java.io.File;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class WarBuilder {
public static void createWar(String sourceDir, String outputFile)
throws IOException {
ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream(outputFile)
);
addDirToZip(new File(sourceDir), "", zos);
zos.close();
System.out.println("WAR создан: " + outputFile);
}
private static void addDirToZip(File dir, String prefix,
ZipOutputStream zos)
throws IOException {
for (File file : dir.listFiles()) {
if (file.isDirectory()) {
addDirToZip(file, prefix + file.getName() + "/", zos);
} else {
ZipEntry entry = new ZipEntry(prefix + file.getName());
zos.putNextEntry(entry);
// Запись файла
zos.closeEntry();
}
}
}
}
Развёртывание WAR
На Tomcat
# Скопировать WAR в webapps директорию
cp myapp.war /opt/tomcat/webapps/
# Tomcat автоматически распакует и развернёт приложение
# Доступ: http://localhost:8080/myapp
На Spring Boot
// Spring Boot приложение может быть упаковано как WAR
// для развёртывания на контейнере приложений
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
WAR vs JAR
| Параметр | WAR | JAR |
|---|---|---|
| Использование | Веб-приложения (Servlet, JSP) | Библиотеки, утилиты |
| Структура | WEB-INF с конфигурацией | Обычная структура пакетов |
| Развёртывание | Контейнер приложений | Автономное приложение |
| web.xml | Обязателен | Не требуется |
| Статические ресурсы | Включены в архив | Не рекомендуется |
Преимущества WAR
- Портативность: Один файл содержит всё приложение
- Версионирование: Легко управлять версиями развёртывания
- Безопасность: Статические ресурсы защищены
- Масштабируемость: Легко развертывать на нескольких серверах
- Стандартизация: Универсальный формат для всех контейнеров приложений
Проверка содержимого WAR
# Просмотр содержимого WAR (это ZIP файл)
jar tf myapp.war
# или
unzip -l myapp.war
# Распаковка WAR
jar xf myapp.war
# или
unzip myapp.war
WAR файлы — стандартный способ упаковки и развёртывания веб-приложений на Java, обеспечивая портативность и простоту управления приложениями в корпоративной среде.