Страницы

Поиск по вопросам

Показаны сообщения с ярлыком javac. Показать все сообщения
Показаны сообщения с ярлыком javac. Показать все сообщения

пятница, 28 февраля 2020 г.

Запуск Java-программы без javac (JDK 11)

#java #javac


Имеется: 

JDK 11 и примитивная программа: 

public class HelloWorld {

   public static void main(String[] args) {
        System.out.println("Hello, World");
   }

}


и применённая к ней команда chmod +x HelloWorld

Необходимо: запустить программу командой ./HelloWorld для печати в терминале:

Hello, World


минуя javac
    


Ответы

Ответ 1



Решение. Шаг 1: Создаём файл nano HelloWorld Шаг 2: #! /usr/local/java/jdk-11-ea18/bin/java --source 11 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World"); } } Шаг 3: ctrl+o, ctrl+x Шаг 4: chmod +x HelloWorld Шаг 5: ./HelloWorld Видим, что программа отработала, и напечатала Hello, World

суббота, 4 января 2020 г.

Компилятор javac - статический компилятор?

#java #jit #javac


Цитата из книги "Java. Новое поколение разработки":


  "В техническом отношении с точки зрения теории компиляции байт-код —
  это действительно своеобразный промежуточный язык (intermediate
  language), а не настоящий машинный код. Это означает, что процесс
  преобразования исходного кода Java в байт-код не является компиляцией
  в том смысле, в каком она понимается в языках C и С++. В свою очередь,
  javac не назовешь таким же компилятором, как gcc. В сущности, это
  генератор файлов классов для обработки исходного кода Java. Настоящим
  компилятором в экосистеме Java является динамический компилятор
  (JIT)".


Правильно ли я понимаю, что, в то время как JIT - динамический компилятор, javac
- статический компилятор?
    


Ответы

Ответ 1



Javac не является статическим компилятором. Потому, что он генерирует байт код, который уже в процессе выполнения программы будет динамически компилироваться в машинный код, или интерпретироваться. Но в java 9 появится возможность генерировать машинный код до запуска программы.

Как собрать произвольное приложение под Android без использовани gradle/ant/Android Studio

#java #gradle #javac #android


Я хочу собрать какое-то произвольное приложение, к примеру, найденное на Гитхабе:
https://github.com/heruoxin/Clip-Stack (само приложение у меня уже есть, потому не
надо мне слать ссылки на бинарные сборки)

Зачастую, в комплекте с приложением есть обертка для Gradle, иногда свойства проекта
от Eclipse, иногда ничего нет. Сам процесс, не смотря на кажущуюся простоту, достаточно
сложен: надо выкачать SDK/NDK (теперь прямых ссылок на них не дают, но об этом позже),
настроить переменные окружения и запустить ./gradlew, а после выкачивания 200-300 мегабайт
зависимостей, очень часто вылезает какая-то ошибка (к примеру о том, что нужна проприетарная
Java 8). И даже если ошибки нет, сборка может сожрать 2-3 гигабайта памяти, весь своп
и затем упасть, ссылаясь на недостаток памяти (ведь нынче все богатые и девелопят исключительно
на макбуках последнего поколения, причем все торопятся - потому все это собирается
в 10 потоков, отжирая в 10 раз больше памяти). Кроме того, такой подход не дает возможности
скомпилировать приложение на изолированной от сети машине: Android Studio Gradle без
подключения к интернет

Вопрос: как собрать приложение без использования толстых сборщиков?

Пожалуй основная проблема происходит из-за сложности разруливания зависимостей. Например,
для сборки приложения выше, мне понадобились: 

support-fragment-25.2.0.aar
support-compat-25.2.0.aar
support-annotations-25.2.0.jar
support-core-utils-25.2.0.aar
support-core-ui-25.2.0.aar
appcompat-v7-22.2.1.aar
recyclerview-v7-25.2.0.aar
cardview-v7-25.2.0.aar


Но быстро выяснилось, что в 25-й версии что-то было изменено и она не подходит, скомпилированное
приложение просто падает. Я выкачал множество версий aar-пакетов и самодельными скриптами
проиндексировал их, создавая самодельную базу символов, но столкнулся с проблемой,
что в какой-то версии нет нужной фичи, а через пару версий этой фичи (или другой) уже
нет. Кроме того, не очень понятно, где и как брать официальные бинарники, без проприетарного
SDK Manager. В общем, я сдался.

Анализ поведения Gradle показал, что javac+dx не используются вообще, а aapt используется
только для обработки картинок.

Если кто-то имеет возможность/хочет написать легковестную IDE или хотя бы скрипт
для сборки приложений, то с радостью присоединюсь к проекту.

Ссылки:


https://developer.android.com/studio/build/building-cmdline.html - официальная инструкция
ведет меня к ненавистному мной Gradle
https://stackoverflow.com/questions/41132753/ - здесь кратко описывается процесс
сборки через javac+dx+aapt, дополнительный блеск  от jarsigner+zipalign. Это работает
(проверял лично), однако, тут не описано как именно это сделать (впрочем, если почитать
мануалы, то становится понятно), равно как не описано, как разруливать зависимости,
что делать с ресурсами и т.д., а кроме того, как установить пакеты из SDK. 
https://metacpan.org/pod/Android::Build - ссылка уже не рабочая, но в архивах можно
найти замечательный скрипт, который мог собрать простенькие приложения под Android


В вопрос призывается Lex Hobbit из Как создать модульное android приложение
    


Ответы

Ответ 1



Как уже написали в комментарии к вопросу - сборка и "жизнь" без Android Studio - очень непроста. Но раз условия диктуют необходимость жить без нее, то будем адаптироваться. Предварительная подготовка среды сборки Java JDK Android SDK (в самом низу страницы в разделе "Get just the command line tools") Настройка переменных среды JAVA_BIN путь до bin папки Java JDK ANDROID_SDK путь до папки с Android SDK Приватный ключ для подписи APK файла (назовем его release_key.keystore) keytool -genkey -v -keystore release_key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000 Написать код приложения и проверить правильность структуры приложения Пошаговый алгоритм сборки Пошаговый алгоритм сборки Android приложения без использования gradle / ant / Android Studio (предполагается, что весь исходный код, включая AndroidManifest.xml, ресурсы, необходимые библиотеки у нас уже есть): Создаем R.java, PK файл из ассетов, ресурсов и AndroidManifest.xml и получаем MyApplication.apk.unaligned используя используя aapt package Компилируем java исходники в *.class исполльзуя для этого javac Создаем исполняемый файл classes.dex из *.class используя dx Добавляем в MyApplication.apk.unaligned файл classes.dex используя aapt add Подписываем MyApplication.apk.unaligned с дебажным или релизным ключем Выравниваем наш APK используя zipalign и вуаля! Создание .aar библиотеки Алгоритм создания библиотеки .aar схож с алгоритмом создания APK файла. в п.1 вместо R.java создаем R.txt используя aapt с опцией --output-text-symbols и название архива с расширением *.aar в п.3 вместо classes.dex создаем classes.jar используя jar cvf classes.jar *.class в п.4 добавляем classes.jar в архива с расширением *.aar и на этом все, наша отдельная AAR библиотека создана P/S чуть позже поправлю и можно написать скриптик для сборки. И кажется, как бы все было проще, если бы всеже перешли к Jack&Jill, но как сообщают разработчики - они осознали, во что это им обойдется. Ниже приведен процесс сборки APK с использованием тулчейна Jack.

Ответ 2



Можно собрать под Intellij IDEA без Gradle. Еще пару лет назад я практиковал такое... Врукопашную собираешь все jar/aar вручную прокидываешь зависимости и вперед. Есть фанаты сборки Android под maven, ах ну да - это же толстый сборщик :) Был опыт сборки под Ant - не знаю насколько он толст для ТС... В любом случае, полностью присоединяюсь к @pavlofff: всем сердцем полюбить Gradle в кратчайшие сроки, либо купить много валерьянки с глицином, потому что современная сборка APK без помощи Android Studio способна "добить" любого

пятница, 20 декабря 2019 г.

“javac” не является внутренней или внешней командой

#java #javac


При компиляции кода через командную строку, с помощью команды javac, выдается вот
такая ошибка


Путь к bin прописан. Вроде все правильно, но все равно выдает ошибку. В чем может
быть дело?
    


Ответы

Ответ 1



Причина ошибки — заданы некорректные «переменные среды». Соответственно, необходимо указать правильные. На рабочем столе откройте «Этот компьютер»: Нажмите слева вверху «Свойства», затем слева в меню — «Дополнительные параметры системы». В открывшейся вкладке «Дополнительно» в самом низу выберите «Переменные среды». Откроется содержимое. Нажмите в каждом окне поочередно «Создать». В окне «Новая пользовательская переменная» пропишите CLASSPATH. Затем в окне «Новая системная переменная» укажите переменную PATH. В поле «Значение» пропишите директорию к пакету JDK. Перезагрузите Windows. Кроме того, чтобы выполнить Javac, вы можете в командной строке прописать полный путь к консоли. К примеру: C:\Program Files\Java\jdk1.8.0_102\bin\javac.exe" MyFile.java Источник

Ответ 2



Если не помогло, добавление в CLASSPATH, то добавь тот же самый путь в PATH, если там уже что-то есть то добавляй через точку с запятой ';'

Ответ 3



Если после добавления путей ничего не поменялось, то сделай копии папок jdk в Programm Files/java и Programm Files(x86)/java

Ответ 4



Небольшое дополнение, путь в переменных мы прописываем до папочки bin, иначе работать не будет. Пример: C:\Program Files\Java\jdk1.8.0_201\bin Перезагружаться скорее всего не понадобиться, но обязательно перезапустите командную строку.

Ответ 5



Надо перенести JAVA_HOME в самое начало переменной PATH, чтобы она была раньше стандартного пути, который прописался при установке: C:\Program Files (x86)\Common Files\Oracle\Java\javapath

четверг, 16 мая 2019 г.

Запуск Java-программы без javac (JDK 11)

Имеется:
JDK 11 и примитивная программа:
public class HelloWorld {
public static void main(String[] args) { System.out.println("Hello, World"); }
}
и применённая к ней команда chmod +x HelloWorld
Необходимо: запустить программу командой ./HelloWorld для печати в терминале:
Hello, World
минуя javac


Ответ

Решение.
Шаг 1: Создаём файл nano HelloWorld
Шаг 2:
#! /usr/local/java/jdk-11-ea18/bin/java --source 11
public class HelloWorld {
public static void main(String[] args) { System.out.println("Hello, World"); }
}
Шаг 3: ctrl+o, ctrl+x
Шаг 4: chmod +x HelloWorld
Шаг 5: ./HelloWorld
Видим, что программа отработала, и напечатала
Hello, World

понедельник, 28 января 2019 г.

Компилятор javac - статический компилятор?

Цитата из книги "Java. Новое поколение разработки":
"В техническом отношении с точки зрения теории компиляции байт-код — это действительно своеобразный промежуточный язык (intermediate language), а не настоящий машинный код. Это означает, что процесс преобразования исходного кода Java в байт-код не является компиляцией в том смысле, в каком она понимается в языках C и С++. В свою очередь, javac не назовешь таким же компилятором, как gcc. В сущности, это генератор файлов классов для обработки исходного кода Java. Настоящим компилятором в экосистеме Java является динамический компилятор (JIT)".
Правильно ли я понимаю, что, в то время как JIT - динамический компилятор, javac - статический компилятор?


Ответ

Javac не является статическим компилятором. Потому, что он генерирует байт код, который уже в процессе выполнения программы будет динамически компилироваться в машинный код, или интерпретироваться
Но в java 9 появится возможность генерировать машинный код до запуска программы.