Launch Single-File Source-Code Programs – dosł. Uruchamianie jednoplikowych programów z kodu źródłowego.
Źródło: https://openjdk.java.net/jeps/330
Ideą jest uruchamianie plików z rozszerzeniem .java bezpośrednio z narzędzia
java
bez użycia narzędzia javac
.
Przykłady
- Klasa Now – prosta klasa
- Klasa Primes – klasa wymagająca podania argumentów
- Klasa Primes2 – użycie opcji
--source
(wskazanie wersji Java) - Klasa Curve05 – więcej niż jedna klasa w pliku źródłowym
- Klasa TestJaver – klasa wymagająca modułu
Klasa Now
package launchsinglefile; import java.time.*; public class Now { public static void main(String[] args) { Instant now = Instant.now(); System.out.println("Chwila teraźniejsza: " + now); } }
Klasa Primes
package launchsinglefile; import java.util.*; public class Primes { public static void main(String[] args) { print(getPrimes(Long.parseLong(args[0]), Long.parseLong(args[1]))); } /** * oblicza liczby pierwsze w podanym zakresie * * @param min long - pierwsza liczba * @param max long - większa liczba * @return ArrayList<Integer> - arraylista liczb pierwszych * leżących między min, a max */ public static ArrayList<Long> getPrimes(long min, long max) { ArrayList<Long> list = new ArrayList<>(); for (long j = min + 1; j < max; j++) { if (isPrime(j)) { list.add(j); } } return list; } public static boolean isPrime(long n) { for (long j = 2; Math.pow(j, 2) <= n; j++) { if (n % j == 0) { return false; } } return true; } // drukuje arrayliste z danymi dowolnego typu // w przypadku typow numerycznych uzywac typow otoczkowych // a nie prostych czyli Double a nie double; public static <T> void print(ArrayList<T> array) { for (int i = 0; i < array.size(); i++) { if (i < array.size() - 1) { System.out.print(array.get(i) + ", "); } else { System.out.print(array.get(i)); } } } }
Klasa Primes2
package launchsinglefile; import java.util.*; public class Primes2 { public static void main(String[] args) { var array = getPrimes(Long.parseLong(args[0]), Long.parseLong(args[1])); print(array); } /** * oblicza liczby pierwsze w podanym zakresie * * @param min long - pierwsza liczba * @param max long - większa liczba * @return ArrayList<Integer> - arraylista liczb pierwszych * leżących między min, a max */ public static ArrayList<Long> getPrimes(long min, long max) { ArrayList<Long> list = new ArrayList<>(); for (long j = min + 1; j < max; j++) { if (isPrime(j)) { list.add(j); } } return list; } public static boolean isPrime(long n) { for (long j = 2; Math.pow(j, 2) <= n; j++) { if (n % j == 0) { return false; } } return true; } // drukuje arrayliste z danymi dowolnego typu // w przypadku typow numerycznych uzywac typow otoczkowych // a nie prostych czyli Double a nie double; public static <T> void print(ArrayList<T> array) { for (int i = 0; i < array.size(); i++) { if (i < array.size() - 1) { System.out.print(array.get(i) + ", "); } else { System.out.print(array.get(i)); } } } }
Klasa Curve05
package launchsinglefile; import java.awt.*; import javax.swing.*; public class Curve05 extends JFrame { /** * */ private static final long serialVersionUID = 5533707010593453907L; public static void main(String[] args) { SwingUtilities.invokeLater(() -> new Curve05(new Lissajous())); } public Curve05(JComponent comp) { setLayout(null); int fw = 1000; int fh = 1000; setPreferredSize(new Dimension(fw, fh)); setBounds((Toolkit.getDefaultToolkit().getScreenSize().width / 2) - (fw / 2), (Toolkit.getDefaultToolkit().getScreenSize().height / 2) - (fw / 2), fw, fh); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("Ramka Graficzna"); // setResizable(false); JPanel panel = (JPanel) comp; panel.setLocation((fw - panel.getWidth()) / 2, (fh - panel.getHeight()) / 2); add(panel); setVisible(true); } } class Lissajous extends JPanel { private static final long serialVersionUID = -7271420472998056247L; private static final int w = 800; private static final int h = 800; public Lissajous() { setPreferredSize(new Dimension(w, h)); setSize(w, h); setBackground(Color.WHITE); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); lissajous(g2, Color.MAGENTA, 150, 70, 3, 4, Math.PI / 4.0, Math.PI / 2.0, 1000); } public static void lissajous(Graphics2D g2, Color kolor, int A1, int A2, int w1, int w2, double fi1, double fi2, int liczbaPunktow) { g2.setColor(kolor); g2.translate(400, 400); int x1 = (int) (A1 * Math.cos(fi1)); int y1 = (int) (A2 * Math.cos(fi2)); int x2; int y2; for (int i = 0; i < liczbaPunktow; i++) { double t = i * Math.PI / 360; x2 = (int) (A1 * Math.cos(w1 * t + fi1)); y2 = (int) (A2 * Math.cos(w2 * t + fi2)); g2.drawLine(x1, y1, x2, y2); x1 = x2; y1 = y2; } } }
Klasa TestJaver
package launchsinglefile; import java.io.*; import java.net.*; import java.net.http.*; class TestJaver { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); try { HttpRequest req = HttpRequest.newBuilder().uri(new URI("https://bajki.blog")).GET().build(); HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString()); int statusCode = res.statusCode(); String body = res.body(); System.out.println("Kod statusu 1: " + statusCode); //System.out.println("Ciało odpowiedzi 1: " + body); res = client.send(req, HttpResponse.BodyHandlers.ofString()); statusCode = res.statusCode(); //body = res.body(); System.out.println("Cialo odpowiedzi 2: " + statusCode); //System.out.println("body 2: " + body); } catch (URISyntaxException | IOException | InterruptedException e) { e.printStackTrace(); } } }
Praca z linią poleceń
Przyjęłam, że pliki klas *.java są umieszczone – podobnie jak u mnie – folderze c:/java. Na komputerze zmienna JAVA_HOME wskazuje na OpenJDK-11.0.1.
Klasa Now
Jest to prosta klasa pokazująca aktualny czas.
Uruchamiamy linię poleceń i wpisujemy jak na obrazku (Rys. 152). Wynik pojawia się po chwili.
Klasa Primes
Klasa oblicza liczby pierwsze w zakresie od args[0] do args[1], a zatem wymaga podania argumentów.
Uruchamiamy linię poleceń i wpisujemy jak na obrazku (Rys. 153).
Klasa Primes2
Klasa tylko tym rożni się od klasy Primes
, że używa słowa var
, które weszło dopiero w
Java 10.
Konieczne jest użycie opcji --source
(wskazanie wersji Java).
Wskazaliśmy zbyt wczesną wersję Java.
Tutaj wstawiliśmy poprawną wersję Java.
Klasa Curve05
W pliku Curve05.java mamy dwie klasy, z których jedna jest publiczna. Nie ma problemów z uruchomieniem (Rys. 156). W oknie pojawia się obraz krzywej.
Po zamknięciu okna sterowanie wraca do inii poleceń (Rys. 157).
Klasa TestJaver
Klasa wymagająca modułu java.net.http
. Klasa Curve05
też wymagała modułu java.desktop
.
Jak widzimy klasa uruchamia się bez problemu mimo braku pliku module-info.java
(Rys. 158)
wskazującego wymagane moduły. Dlaczego?
Kod jest kompilowany i uruchamiany jako część modułu nie nazwanego z użyciem opcji
--add-modules=ALL-DEFAULT
co pozwala na kompilację i wykonanie kodu.