← Назад к вопросам

Что такое war?

1.0 Junior🔥 191 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

ПараметрWARJAR
ИспользованиеВеб-приложения (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, обеспечивая портативность и простоту управления приложениями в корпоративной среде.

Что такое war? | PrepBro