Вот альтернативный ответ с исходным оператором CURL, переписанным с использованием -d
в качестве однострочного, без временных файлов. Лично я думаю, что подход к временным файлам легче понять, но я также привожу это здесь для справки:
curl -X POST -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" -d Примечания: синтаксис таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет.
blar'
таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет. ------------------------------4ebf00fbcf09\r\nContent-Disposition: form-data; name="example"\r\n\r\ntest\r\n------------------------------4ebf00fbcf09--\r\n' http://localhost:3000/test
Примечания: синтаксис таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет.
blar' таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет.
Я разобрался. Может ли кто-нибудь сказать мне, всегда ли эта переменная среды будет присутствовать в других реализациях java в операционных системах? Это в Oracle JVM дает строку типа org.xyClassName
public static String getMainClassName() {
for (final Map.Entry<String, String> entry : System.getenv().entrySet())
if (entry.getKey().startsWith("JAVA_MAIN_CLASS")) // like JAVA_MAIN_CLASS_13328
return entry.getValue();
throw new IllegalStateException("Cannot determine main class.");
}
Попробуйте использовать Thread.getAllStackTraces () . Он возвращает карту трассировки стека для всех запущенных потоков, а не только для текущего.
Учитывая пояснение, я предлагаю использовать идиому «Параметризация сверху». У вас есть информация для начала, держите ее.
Как насчет чего-то вроде:
Map<Thread,StackTraceElement[]> stackTraceMap = Thread.getAllStackTraces();
for (Thread t : stackTraceMap.keySet())
{
if ("main".equals(t.getName()))
{
StackTraceElement[] mainStackTrace = stackTraceMap.get(t);
for (StackTraceElement element : mainStackTrace)
{
System.out.println(element);
}
}
}
Это даст вам что-то вроде
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:231)
java.lang.Thread.join(Thread.java:680)
com.mypackage.Runner.main(Runner.java:10)
Главный поток, вероятно, не гарантированно называется "основным"
, хотя - может быть Лучше проверить элемент трассировки стека, содержащий (main
Edit , если основной поток завершился, это бесполезно!
Я предлагаю поместить эту информацию в системное свойство. Обычно это просто сделать, когда вы запускаете приложение из сценария.
Если вы не можете этого сделать, я предлагаю установить свойство в методе main () каждого приложения. Самый простой способ - заставить каждое приложение унаследовать свой «основной класс» от общего базового класса и выполнить там шаг инициализации. Я часто делаю это для обработки командной строки:
public class Demo extends Main {
main(String[] args) {
Main._main(new Demo (), args);
}
// This gets called by Main._main()
public void run (String[] args) {
}
}