Skip to the content.

Технологии программирования

Назад к списку лекций

Сборка приложения Java. Клиент-серверная архитектура. Трехслойная архитектура бэкенда.

Сборка приложения Java.

Мы привыкли собирать и запускать приложение через Idea. Но как это сделать вручную? Необходимо скомпилировать нашу программу в байт-код, а после этого запустить его.

Компиляция — приведение исходного кода в байт-код для последующего старта программы. (В качестве доп. инфы - статья про байт-код)

Порядок действий:

Возьмем для примера простую одноклассовую программу:


class Test {
   public static void main(String[] args) {
      System.out.println("This is our test compilation");
   }
}

Поместим этот код в файл Test.java. Чтобы скомпилировать нашу программу воспользуемся утилитой javac. Для этого в командной строке необходимо выполнить команду

javac Test.java

После этого мы получим файл Test.class и сможем его запустить при помощи команды:

java Test

Как скомпилировать приложение из нескольких классов?

Добавим новый класс

class Test {
    public static void main(String[] args) {
        Student st = new Student();
        st.name = "Petya";
        st.sayHello();
        System.out.println("This is our test compilation");
    }
}

class Student {
    public String name;
    
    public void sayHello() {
        System.out.println("Hello, this is " + name);
    }
}

Чтобы скомпилировать программу из нескольких классов поместим их в папку src, создадим папку bin для файлов .class и выполним команду:

javac -d bin ./src/*

Далее для запуска программы нужно выполнить команду:

java -classpath ./bin Test

Можно ли сделать один исполняемый файл?

Да, но нам потребуется манифест. Создадим файл manifest.mf Манифест - это файл пары ключей-значений, в котором мы описываем параметры сборки приложений:

main-class: Test
class-path: bin/

Поместим этот файл в root папку проекта и выполним команду:

jar -cmf manifest.mf spbu.jar  -C bin .

Мы получили файл spbu.jar. Теперь мы можем легко транспортировать нашу программу, просто скопировав наш jar файл. Чтобы запустить его нужно выполнить команду:

java -jar spbu.jar

Чуть подробнее этот пример разбирается в статье

Системы сборок.

Ant, Maven и Gradle.

Maven - в файлах конфигурации описываем проект и дополнительные инструменты

Структура проекта:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>ru.javarush.testmaven</groupId>
  <artifactId>spbu_arts</artifactId>
  <version>1.0.0</version>

  <build>
     <defaultGoal>compile</defaultGoal>
     <sourceDirectory>src</sourceDirectory>
     <outputDirectory>bin</outputDirectory>
     <finalName>${project.artifactId}-${project.version}</finalName>
  </build>
</project>

Gradle

apply plugin: 'java'
apply plugin: 'application'

sourceSets {
   main {
       java {
           srcDirs 'src'
       }
   }
}
sourceSets.main.output.classesDir = file("bin")

mainClassName = "src.BoxMachine"

defaultTasks 'compileJava', 'run'

Система управления сборкой проектов на основе Groovy. Скрипты сборки Gradle - по сути скрипты Groovy

task hello {
    doLast {
        println 'Hello!'
    }
}

task fromSpbu(dependsOn: hello) {
    doLast {
        println "I'm from spbu"
    }
}

Можно добавить поведение к задаче

task helloSpbu {
    doLast {
        println 'I will be executed second!'
    }
}

helloSpbu.doFirst {
    println 'I will be executed first!'
}

helloSpbu.doLast {
    println 'I will be executed last!'
}

Плагины

Плагины - бывают двух видов: скриптовые и бинарные. Скриптовые:


// in spbu.gradle
task fromPlugin {
    doLast {
        println "I'm from plugin"
    }
}

// in build.gradle
apply from: 'aplugin.gradle'

Бинарные

plugins {
    id "org.shipkit.bintray" version "2.3.5"
}

Объявление репозитория

repositories {
    mavenCentral()
}

Maven Central - центральный репозиторий Maven. Ссылка тык сюда Искать пакеты можно туть

Зависимости

dependencies {
    implementation group: 
      'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'
    implementation 'org.springframework:spring-core:4.3.5.RELEASE',
            'org.springframework:spring-aop:4.3.5.RELEASE'
    implementation(
        [group: 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'],
        [group: 'org.springframework', name: 'spring-aop', version: '4.3.5.RELEASE']
    )
    testImplementation('org.hibernate:hibernate-core:5.2.12.Final') {
        transitive = true
    }
    runtimeOnly(group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final') {
        transitive = false
    }
}

Локальные зависимости:

implementation files('libs/joda-time-2.2.jar', 'libs/junit-4.12.jar')
implementation fileTree(dir: 'libs', include: '*.jar')

Виды объявления зависимостей:

Дока тут

Некоторые tasks из плагина java

Список всех задач смотри в доке здесь

Клиент-серверная архитектура

см доску Miro