LINUX.ORG.RU

Передать параметр в PlantUML под Tomcat 8

 , ,


0

2

Имеется PlantUML запущенный под Tomcat 8. PlantUML нужно передать параметр

-GRAPHVIZ_DOT=/usr/bin/dot
Как это осуществить? /var/lib/tomcat8/conf/server.xml
<Service name="plantuml">
 <Connector port="8082" protocol="HTTP/1.1" address="127.0.0.1" connectionTimeout="20000" redirectPort="8444" />
 <Engine name="Catalina" defaultHost="localhost">
 <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
 <Context path="" docBase="plantuml" debug="0" privileged="true">
  <Parameter name="GRAPHVIZ_DOT" value="-GRAPHVIZ_DOT=/usr/bin/dot" override="false" />
 </Context>
 </Host>
 </Engine>
</Service>



Последнее исправление: fynjirf (всего исправлений: 1)

Ответ на: комментарий от sanwashere

Не помогло.

root@test01:/usr/share/tomcat8/bin# cat /usr/share/tomcat8/bin/setenv.sh 
GRAPHVIZ_DOT=/usr/bin/dot
root@test01:/usr/share/tomcat8/bin# ls -al /usr/share/tomcat8/bin/setenv.sh
-rwxr-x--x 1 root root 26 Jan 12 21:46 /usr/share/tomcat8/bin/setenv.sh

fynjirf
() автор топика
Ответ на: комментарий от fynjirf

Почитать catalina.sh, он читается оттуда. Возможно твои скрипты, которыми ты запускаешь томкат, переопределяют CATALINA_BASE, тогда будет использоваться $CATALINA_BASE/bin/setenv.sh (если он есть). Можешь подредактировать catalina.sh и поставить там что-нибудь вроде set >> /tmp/env или посмотреть в /proc/pid/environ, не помню, используется ли он ещё в линуксе.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 2)
Ответ на: комментарий от sanwashere

Проблема осталась. Как можно убедиться в том, что конфиг из этого файла вообще читается?

fynjirf
() автор топика
Ответ на: комментарий от Legioner

А как узнать что «$CATALINA_BASE» именно на эту директорию ссылается?

root@test01:/usr/share/tomcat8/bin# grep -i setenv.sh catalina.sh
#   setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
# but allow them to be specified in setenv.sh, in rare case when it is needed.
if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
root@test01:/usr/share/tomcat8/bin# 

fynjirf
() автор топика
Ответ на: комментарий от Legioner
root@test01:/usr/share/tomcat8/bin# cat /run/systemd/generator.late/tomcat8.service
# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/tomcat8
Description=LSB: Start Tomcat.
After=remote-fs.target
After=network-online.target
After=nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/tomcat8 start
ExecStop=/etc/init.d/tomcat8 stop
root@test01:/usr/share/tomcat8/bin# cat /etc/init.d/tomcat8
CATALINA_HOME=/usr/share/$NAME

# Directory for per-instance configuration files and webapps
CATALINA_BASE=/var/lib/$NAME

# Use the Java security manager? (yes/no)
TOMCAT8_SECURITY=no

# Default Java options
# Set java.awt.headless=true if JAVA_OPTS is not set so the
# Xalan XSL transformer can work without X11 display on JDK 1.4+
if [ -z "$JAVA_OPTS" ]; then
        JAVA_OPTS="-Djava.awt.headless=true"
fi

# End of variables that can be overwritten in $DEFAULT

# overwrite settings from default file
if [ -f "$DEFAULT" ]; then
        . "$DEFAULT"
fi

if [ ! -f "$CATALINA_HOME/bin/bootstrap.jar" ]; then
        log_failure_msg "$NAME is not installed"
        exit 1
fi

POLICY_CACHE="$CATALINA_BASE/policy/catalina.policy"

if [ -z "$CATALINA_TMPDIR" ]; then
        CATALINA_TMPDIR="$JVM_TMP"
fi

# Set the JSP compiler if set in the tomcat8.default file
if [ -n "$JSP_COMPILER" ]; then
        JAVA_OPTS="$JAVA_OPTS -Dbuild.compiler=\"$JSP_COMPILER\""
fi

SECURITY=""
if [ "$TOMCAT8_SECURITY" = "yes" ]; then
        SECURITY="-security"
fi

# Define other required variables
CATALINA_PID="/var/run/$NAME.pid"
CATALINA_SH="$CATALINA_HOME/bin/catalina.sh"

# Look for Java Secure Sockets Extension (JSSE) JARs
if [ -z "${JSSE_HOME}" -a -r "${JAVA_HOME}/jre/lib/jsse.jar" ]; then
    JSSE_HOME="${JAVA_HOME}/jre/"
fi

catalina_sh() {
        # Escape any double quotes in the value of JAVA_OPTS
        JAVA_OPTS="$(echo $JAVA_OPTS | sed 's/\"/\\\"/g')"

        AUTHBIND_COMMAND=""
        if [ "$AUTHBIND" = "yes" -a "$1" = "start" ]; then
                AUTHBIND_COM
        ;;
  stop)
        log_daemon_msg "Stopping $DESC" "$NAME"

        set +e
        if [ -f "$CATALINA_PID" ]; then 
                start-stop-daemon --stop --pidfile "$CATALINA_PID" \
                        --user "$TOMCAT8_USER" \
                        --retry=TERM/20/KILL/5 >/dev/null
                if [ $? -eq 1 ]; then
                        log_progress_msg "$DESC is not running but pid file exists, cleaning up"
                elif [ $? -eq 3 ]; then
                        PID="`cat $CATALINA_PID`"
                        log_failure_msg "Failed to stop $NAME (pid $PID)"
                        exit 1
                fi
                rm -f "$CATALINA_PID"
                rm -rf "$JVM_TMP"
        else
                log_progress_msg "(not running)"
        fi
        log_end_msg 0
        set -e
        ;;
   status)
        set +e
        start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                --user $TOMCAT8_USER --exec "$JAVA_HOME/bin/java" \
                >/dev/null 2>&1
        if [ "$?" = "0" ]; then

                if [ -f "$CATALINA_PID" ]; then
                    log_success_msg "$DESC is not running, but pid file exists."
                        exit 1
                else
                    log_success_msg "$DESC is not running."
                        exit 3
                fi
        else
                log_success_msg "$DESC is running with pid `cat $CATALINA_PID`"
        fi
        set -e
        ;;
  restart|force-reload)
        if [ -f "$CATALINA_PID" ]; then
                $0 stop
                sleep 1
        fi
        $0 start
        ;;
  try-restart)
        if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                --user $TOMCAT8_USER --exec "$JAVA_HOME/bin/java" \
                >/dev/null; then
                $0 start
        fi
        ;;
  *)
        log_success_msg "Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
        exit 1
        ;;
esac

exit 0
root@test01:/usr/share/tomcat8/bin# 

fynjirf
() автор топика
Ответ на: комментарий от fynjirf

CATALINA_BASE/CATALINA_HOME фактически рассчитывается относительно catalina.sh, если не переопределено.
Судя по /usr/share/tomcat8, томкат штатный, из пакета. Стоит посмотреть на всякий случай rc-сценарий (в /etc/init.d/), или systemd unit, или что там ещё у вас, на предмет переопределения.

sanwashere ★★
()
Ответ на: комментарий от fynjirf

Тогда должен бы цеплять. Да и судя по коду, он и так проверяет пути /usr/local/bin/dot и /usr/bin/dot самостоятельно при отсутствии значения переменной среды и свойства JVM.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 2)
Ответ на: комментарий от sanwashere

Видимо, это косяк PlantUML.

@startuml
testdot
@enduml
выдаёт The environment variable GRAPHVIZ_DOT has not been set при этом диаграммы из этих двух примеров корректно формируются, даже при удалённом setenv.sh

fynjirf
() автор топика
Ответ на: комментарий от fynjirf

Какой-то у тебя странный скрипт /etc/init.d/tomcat8. esac есть, а case нет. Как будто вырезан кусок в середине.

Я бы советовал скачать tomcat tar.gz с официального сайта, распаковать куда-нибудь, закинуть туда нужный .war и попробовать запустить его с setenv.sh который тебе советовали (без всяких systemd, просто через bin/startup.sh). Хотя бы чтобы убедиться, что проблема не в кривых руках тех, кто томкат для твоего дистрибутива собирал.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 3)
Ответ на: комментарий от Legioner

Да, теперь параметр передаётся.

root@test01:~/test/tomcat/apache-tomcat-8.5.37/bin# ps -axu | grep -i jav[a]
root     13333  0.8 22.7 2317376 229892 pts/2  Sl   15:35   0:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.util.logging.config.file=/root/test/tomcat/apache-tomcat-8.5.37/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -DGRAPHVIZ_DOT=/usr/bin/dot -Dignore.endorsed.dirs= -classpath /root/test/tomcat/apache-tomcat-8.5.37/bin/bootstrap.jar:/root/test/tomcat/apache-tomcat-8.5.37/bin/tomcat-juli.jar -Dcatalina.base=/root/test/tomcat/apache-tomcat-8.5.37 -Dcatalina.home=/root/test/tomcat/apache-tomcat-8.5.37 -Djava.io.tmpdir=/root/test/tomcat/apache-tomcat-8.5.37/temp org.apache.catalina.startup.Bootstrap start
root@test01:~/test/tomcat/apache-tomcat-8.5.37/bin# 
Но, PlantUML не формирует диаграммы. Вместо диаграммы:
Sorry, but things didn't work out as planned.

Sun Jan 13 16:10:33 MSK 2019
Request that failed: /png/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000
Status code: 500
Exception: java.lang.NoClassDefFoundError: Could not initialize class net.sourceforge.plantuml.servlet.DiagramResponse
apache-tomcat-8.5.37/logs/localhost.2019-01-13.log :
13-Jan-2019 16:10:33.144 SEVERE [http-nio-8082-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [imgservlet] in context with path [] threw exception [Servlet execution threw an exception] with root cause
 java.lang.NoClassDefFoundError: Could not initialize class net.sourceforge.plantuml.servlet.DiagramResponse
        at net.sourceforge.plantuml.servlet.UmlDiagramService.doDiagramResponse(UmlDiagramService.java:91)
        at net.sourceforge.plantuml.servlet.UmlDiagramService.doGet(UmlDiagramService.java:60)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

fynjirf
() автор топика
Ответ на: комментарий от fynjirf

Попробуй поискать в логе другие ошибки, которые случились до этого. Эта ошибка не очень информативна и вызвана другими ошибками.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Судя по всему, только вышеприведённые строки добавляются в лог, после обращения к сервису (PlantUML). Ниже ссылка на логи с момента запуска Tomcat (старые все удалил) и на дополненный лог, после обращения к PlantUML. http://paste.org.ru/?kldl9e

fynjirf
() автор топика
Ответ на: комментарий от Legioner

Опция -Djava.awt.headless=true позволила отображать диаграмму, но добавив её в setenv.sh

root@test01:~/test/tomcat/apache-tomcat-8.5.37/bin# cat setenv.sh 
CATALINA_OPTS=-DGRAPHVIZ_DOT=/usr/bin/dot
CATALINA_OPTS=-Djava.awt.headless=true
и запустив tomcat, java запускается без -DGRAPHVIZ_DOT. Ниже сравнение ps -aux при запуске с одной опцией и с двумя.

https://www.diffchecker.com/UGwPCduB

fynjirf
() автор топика
Ответ на: комментарий от fynjirf
CATALINA_OPTS=“-DGRAPHVIZ_DOT=/usr/bin/dot -Djava.awt.headless=true”

Пишу с телефона, кавычки, возможно, неправильные будут, лучше не копипастить из этого сообщения.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Благодарю, теперь и диаграммы формирует и тест

@startuml
testdot
@enduml
проходит!

fynjirf
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.