Вы используете java:8
базовое изображение, которое, скорее всего, не обеспечивает графическое окружение.
Вы можете использовать ubuntu:18.04
базовый образ с установленными вручную пакетами openjdk-11-jdk
и xvfb
. Команда xvfb-run
позаботится о настройке виртуальной среды X-сервера:
xvfb-run устанавливает файл полномочий X (или использует существующий, указанный пользователем), записывает в него куки (см. xauth (1x)) и затем запускает X-сервер Xvfb в качестве фонового процесса. Идентификатор процесса Xvfb сохраняется для последующего использования. Затем указанная команда выполняется с использованием дисплея X, соответствующего только что запущенному серверу Xvfb и ранее созданному файлу полномочий X.
blockquote>Dockerfile
FROM ubuntu:18.04 RUN apt-get update -y && apt-get upgrade -y && apt-get install -y openjdk-11-jdk xvfb ADD JFrameDocker.java MANIFEST.mf ./ RUN javac JFrameDocker.java RUN jar cfm JFrameDocker.jar MANIFEST.mf JFrameDocker.class RUN xvfb-run java -jar JFrameDocker.jar
JFrameDocker.java
import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class JFrameDocker { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JLabel lable = new JLabel("Hello World"); panel.setLayout(new FlowLayout()); frame.add(panel); panel.add(lable); frame.setSize(800, 600); frame.setVisible(true); System.out.println("Up and running"); } }
MANIFEST.mf
Manifest-Version: 1.0 Main-Class: JFrameDocker
Переменные пакета? Лексические переменные?
Переменные пакета можно найти через таблицу символов. Попробуйте Devel :: Symdump :
#!/path/to/perl
use Devel::Symdump;
package example;
$var = "value";
@var = ("value1", "value2");
%var = ("key1" => "value1", "key2" => "value2");
my $obj = Devel::Symdump->new('example');
print $obj->as_string();
Лексические переменные немного сложнее, вы не найдете их в таблице символов. Их можно найти через «блокнот», принадлежащий блоку кода, в котором они определены. Попробуйте PadWalker :
#!/path/to/perl
use strict;
use warnings;
use Data::Dumper;
use PadWalker qw(peek_my);
my $var = "value";
my @var = ("value1", "value2");
my %var = ("key1" => "value1", "key2" => "value2");
my $hash_ref = peek_my(0);
print Dumper($hash_ref);
Глобальная таблица символов - % main ::
, поэтому вы можете получить глобальные переменные оттуда. Тем не менее, каждая запись является глобальным типом, который может содержать несколько значений, например, $ x, @x,% x и т. Д., Поэтому вам нужно проверить каждый тип данных. Вы можете найти код, который делает это здесь . Комментарии на этой странице могут помочь вам найти другие решения для неглобальных переменных (например, лексических переменных, объявленных с помощью «my»).
Модуль PadWalker предоставляет вам peek_my
и peek_our
, которые принимают аргумент LEVEL, определяющий, в какой области искать переменные в:
The LEVEL argument is interpreted just like the argument to caller.
So peek_my(0) returns a reference to a hash of all the my variables
that are currently in scope; peek_my(1) returns a reference to a hash
of all the my variables that are in scope at the point where the
current sub was called, and so on.
Вот пример:
#!/usr/bin/perl
use strict;
use warnings;
use PadWalker qw/peek_my/;
my $baz = "hi";
foo();
sub foo {
my $foo = 5;
my $bar = 10;
print "I have access to these variables\n";
my $pad = peek_my(0);
for my $var (keys %$pad) {
print "\t$var\n";
}
print "and the caller has these variables\n";
$pad = peek_my(1);
for my $var (keys %$pad) {
print "\t$var\n";
}
}
Ответ Натана является частью истории - к сожалению, остальная часть истории состоит в том, что лексические переменные не не перечислено в % main ::
или где-либо еще (по крайней мере, в любом месте, доступном из Perl - возможно, возможно написать некоторый волосатый код XS, который копает эту информацию из внутренних элементов Perl на уровне C).
Лексические переменные - это то, что вы обычно используете для «обычных локальных» переменных. Они объявлены как:
my $x;
Это было бы для чего-то кроме целей отладки? Если нет, вы можете ознакомиться с отладчиком perl . Оказавшись внутри отладчика, вы можете проверить все переменные, введя «V».