डेबियन पर जावा के लिए पैठ स्थापित करने में परेशानी


2

मैं डेबियन 6 पर सही ढंग से काम करने के लिए ओरेकल जावा 7 अपडेट 3 प्राप्त करने की कोशिश कर रहा हूं। मैंने फ़ाइलों को डाउनलोड और सेट किया है /usr/java/jre1.7.0_03। मैंने निम्नलिखित दो पंक्तियों को भी इसके अंत में निर्धारित किया है /etc/bash.bashrc:

export JAVA_HOME=/usr/java/jre1.7.0_03
export PATH=$PATH:$JAVA_HOME/bin

अन्य उपयोगकर्ताओं के रूप में लॉग इन करना और रूट ठीक है, जावा पाया जा सकता है:

chris@mc:~$ java -version
java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)

हालांकि दो मामले हैं जहां जावा को नीचे विस्तृत रूप में नहीं पाया जा सकता है। ध्यान दें कि इन दोनों ने ठीक काम किया है जब मैंने पहले OpenJDK Java 6 को एप्टीट्यूड के माध्यम से स्थापित किया है, लेकिन मुझे विभिन्न कारणों से Oracle जावा 7 की आवश्यकता है।

  1. सबसे महत्वपूर्ण बात, मैं उन अन्य उपयोगकर्ता के रूप में कमांड नहीं चला सकता su, जो पैठ दिखाने के बावजूद कि जावा मौजूद होना चाहिए। उपयोगकर्ता के साथ बनाया गया थाadduser chris

    root@mc:~# su chris -c "echo $PATH"
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/jre1.7.0_03/bin:/bin
    root@mc:~# su chris -c "java -version"
    bash: java: command not found
    root@mc:~# su chris -c "/usr/java/jre1.7.0_03/bin/java -version"
    java version "1.7.0_03"
    ...
    

    यह कैसे हो सकता है PATHलेकिन पाया नहीं जा सकता है? अपडेट 2012/05/04:, डैनियल द्वारा समझाया यह इसलिए इस तरह के रूप में फाइल एक गैर-सहभागी खोल जा रहा है के साथ क्या करना /etc/profileहै और /etc/bash.bashrcनिष्पादित नहीं कर रहे हैं। उस उपयोगकर्ता को पूर्ण स्वैप करना और जावा काम करना:

    root@mc:~# su chris
    chris@mc:/root$ java -version
    java version "1.7.0_03"
    ...
    
  2. मैं स्टार्ट अप पर एक स्क्रिप्ट चलाता हूं जो समान लेकिन थोड़ी अलग समस्याओं को प्रदर्शित करता है। स्क्रिप्ट /etc/init.d/start-mystuff.shजार में स्थित है और कॉल करता है:

    #!/bin/bash
    # /etc/init.d/start-mystuff.sh
    java -jar /opt/Mars.jar
    

    मैं पुष्टि कर सकता हूं कि स्क्रिप्ट स्टार्ट अप पर चलती है और निकास कोड 127 है, जो इंगित करता है कि कमांड नहीं मिला। PATHशो को प्रिंट / सेव करने के लिए एक लाइन डालना

     /sbin:/usr/sbin:/bin:/usr/bin
    

    यह दूसरी समस्या उतनी महत्वपूर्ण नहीं है क्योंकि मैं स्क्रिप्ट में जावा निष्पादन योग्य को सीधे इंगित कर सकता हूं, लेकिन मैं अभी भी उत्सुक हूं!

मैंने पूरी PATHऔर JAVA_HOMEस्पष्ट रूप से सेटिंग करने की कोशिश की है /etc/environmentजिसमें मदद नहीं की। मैंने उन्हें स्थापित करने की भी कोशिश की है /etc/profileजिसमें मदद करने के लिए प्रतीत नहीं होता है। मैंने PATHविभिन्न स्थानों (डुह!) में स्थापित करने के बाद फिर से लॉग इन करने की कोशिश की है ।

वैसे भी, शायद एक सरल एक लाइन समाधान के लिए लंबी पोस्ट :( इसके साथ किसी भी मदद की बहुत सराहना की जाएगी, मैंने खुद को इसे ठीक करने की कोशिश में बहुत लंबा समय बिताया है।

प्रेरणा

पहली समस्या अस्पष्ट लग सकती है लेकिन मेरे सिस्टम में मेरे पास ऐसे उपयोगकर्ता हैं जिन्हें एसएसएच एक्सेस की अनुमति नहीं है फिर भी मैं अभी भी उनके रूप में प्रक्रियाएं चलाना चाहता हूं। मेरे पास इस तरह से लिपियों का एक टन है और मैं उन सभी को बदलना नहीं चाहता।

जवाबों:


3

देखें: अद्यतन-विकल्प

इसके अलावा: डेबियन आम तौर पर ईएनवी चर पर भरोसा करने वाले डेवलपर्स को हतोत्साहित करता है , आपने इसका एक कारण खोजा है।

यह नहीं है कि वे इसकी वर्जित हैं कि उन्हें हमेशा उपलब्ध होने की उम्मीद नहीं की जानी चाहिए।

नोट: मौजूदा रास्ते के अंत में अपने जावा पथ को जोड़ने का मतलब है कि कोई अन्य जावा मिल जाएगा, और इसका उपयोग किया जाएगा, पहले।

(यानी / सिमरल) अंडर / usr / बिन)

इसलिए:

ls -lah /usr/bin/java

कहते हैं:

lrwxrwxrwx 1 रूट रूट 22 अप्रैल 22 2011 / usr / बिन / जावा -> / आदि / विकल्प / जावा

file $(which java)

/ usr / बिन / जावा: प्रतीकात्मक लिंक `/ आदि / विकल्प / जावा 'के लिए

file /etc/alternatives/java

/ etc / विकल्प / जावा: / / usr / lib / jvm / java-6-openjdk-i386 / jre / bin / java ’का प्रतीकात्मक लिंक

** <साइड इश्यू> और यह भी प्रदर्शित करता है कि $ (सब्स्क्राइब्ड स्टाइल में निष्पादन) बेहतर क्यों है, "बैकटिक एक्ज़क्यूट मोड", या "इसे एक्वल"।

((जैसा कि `` '' '' '' '' 'और' 'और' '' '' '' '' '' '' '' '' '' '' '' का तरीका है, '' '' '' और '' '' '' '' '' '' '' '' '' '' '' 'के रूप में' '``' 'और' '' '' '' '' '' '' '' '' 'के रूप में मेरे लिए कम से कम, और हमेशा सभी गोले में अपेक्षित रूप से काम नहीं करता है।' 'POSIX मोड की जांच करें AKA / bin / sh)।

</ साइड मुद्दा> **

man update-alternatives बताते हैं कि यह वैकल्पिक प्रणाली क्यों मौजूद है ...

इसी बीच

update-alternatives --config java 

मदद कर सकता है।

/ usr / स्थानीय / स्रोत निर्मित पैकेज स्थापित करने के लिए एक अच्छी जगह है ...

आपकी बिल्ली की त्वचा के अन्य तरीके भी हैं।

समेत:

  • हाथ पुनः इंगित / usr / बिन / जावा लिंक :)

(हालांकि उन्नयन या निर्भरता के लिए बाहर देखो इसे रीसेट कर रहा है .. एक बढ़िया विकल्प नहीं है लेकिन यह काम करता है)

  • प्रति उपयोगकर्ता जावा के लिए एक उपनाम सेट करना [1]

  • उपयोगकर्ताओं में $ PATH को प्रचलित करना .bashrc

(यदि आप चाहें तो .bash_profile से .bashrc स्रोत कर सकते हैं)

  • प्रति उदाहरण विशिष्ट संस्करणों को पूर्ण पथ पर कॉल करना

(सबसे सुरक्षित शर्त लेकिन शायद व्यावहारिक नहीं)

[१] .लियास या .बश्श

help alias

(इसके बाश बिलिन)

अंत में अच्छे या बीमार के लिए एक उदाहरण: मेरे डेबियन से लिया गया। bash_profile ...

# include .bashrc if it exists

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# set PATH so it includes user's private bin if it exists
if [ -d ~/bin ] ; then
    PATH=~/bin:"${PATH}"
fi

आशा है कि यह बाधा के बजाय मदद करता है

पीट


हाय पीट, मैं अद्यतन-विकल्प के साथ चारों ओर एक नाटक होगा; यह पर्यावरण चर के साथ खिलवाड़ करने से बहुत बेहतर लगता है। हो सकता है कि मैंने अपने मूल पोस्ट में उल्लेख किया हो, लेकिन मैंने डेबियन की एक न्यूनतम स्थापना से शुरू किया था, जिस पर जावा का कोई संस्करण नहीं था। और मुझे लगता है कि सभी को env चर पर निर्भर होने से हतोत्साहित किया जाना चाहिए, चाहे उनकी प्रणाली कोई भी हो;) धन्यवाद!
मिल्कमांसरेगेज

@milkmansrevenge कूल सौभाग्य, यह जितना दिखता है उससे कहीं अधिक जटिल है।
पीटरगोज़

हाँ, यह हास्यास्पद सरल निकला। भविष्यवाणी के रूप में एक पंक्ति :) update-alternatives --install /usr/bin/java jre7u3 /usr/java/jre1.7.0_03/bin/java 5। मुझे इसका उपयोग करने का एक और तरीका भी मिला $BASH_ENVलेकिन अद्यतन-विकल्प सबसे अच्छा है। मैं अपने प्रश्न को अपडेट करूंगा, इसलिए यह सभी जल्द ही किसी भी अन्य आगंतुकों के लिए स्पष्ट है। संपादित करें: आप के साथ टैग नहीं कर सकते @, लगता है कि मेरी रेटिंग बहुत कम है।
मिल्कमांसरेगेज

1

एक बार में कई सवाल, लेकिन:

1. तुम

# su chris -c "echo $PATH"

यह $PATHकमांड चलने से पहले वैरिएबल को बदलेगा, जो $PATHरूट के लिए देगा । प्रयत्न, कोशिश

# su chris -c "echo $HOME"

देखने के लिए मेरा क्या मतलब है।

इसके बजाय, आप कर सकते हैं

# su chris -c 'echo $PATH'

जो पहले मामले में चर के विस्तार से खोल में बाधा जाएगा, और बजाय वास्तव में प्राप्त chrisकी $PATH। आप सबसे अधिक संभावना यह पाएंगे कि परिवर्तनों ने उस उपयोगकर्ता को अनुमति नहीं दी है।

फिर क्यों नहीं? डेबियन सिस्टम /bin/shसे जुड़ा हुआ है /bin/dash, और नहीं /bin/bash। डैश नहीं पढ़ेंगे /etc/bash.bashrc। संभवतः आपको डैश के रूप में उपयोगकर्ता के लिए डिफ़ॉल्ट शेल मिला chrisजब वह बनाया गया था। देखने के /etc/passwdलिए देखें कि क्या यह मामला है।

शायद यह प्रश्न 2 को भी स्पष्ट करता है।


अद्यतन: आह, /etc/bash.bashrcकेवल इंटरैक्टिव गोले के लिए पढ़ा जाता है। पढ़ें man bash, अनुभाग "फ़ाइलें"। जब आप suइस तरह से उपयोग करते हैं तो आप एक इंटरैक्टिव शेल शुरू नहीं करते हैं ।


अद्यतन 2: यह उदाहरण एक तरीका है:

# su chris -c 'myvar="hi there"; echo $myvar'
hi there

या इसी तरह:

# su chris -c 'export myvar="hi there"; echo $myvar; export | grep myvar'
hi there
declare -x myvar="hi there"

(के साथ export, चर उप-प्रक्रियाओं के रूप में अच्छी तरह से, हमेशा की तरह उपलब्ध है)।


धन्यवाद, मुझे नहीं पता था कि यह एक साधारण प्रतिस्थापन था जब उपयोग करने के "बजाय ', हालांकि: chris:x:1001:1001:,,,:/home/chris:/bin/bashइंगित करता है कि /bin/bashसही के लिए डिफ़ॉल्ट शेल है chris?
मिल्कमांसरेगेज

हाँ, यह वास्तव में इंगित करता है। हालाँकि, इंटरेक्टिव गोले और स्टार्ट अप फाइलों के बारे में मेरे उत्तर के अपडेटेड सेक्शन को पढ़ें।
डैनियल एंडरसन

@milkmansrevenge: अपने उपयोगकर्ता नाम को उजागर करना भूल गए ताकि आप अधिसूचित हो जाएं, और लगता है कि समय की एक अनंत राशि के साथ संपादित समय चूक गए ... मेरी उपरोक्त टिप्पणी पढ़ें।
डैनियल एंडरसन

धन्यवाद। मैं अपने प्रश्न का अनुमान लगाता हूं, बस यह हो जाता है: मैं $PATHगैर-संवादात्मक गोले कैसे सेट करूं ? "फ़ाइलें" अनुभाग man bashसंकेत देता है कि मेरे समाधान काम नहीं करेंगे। अगर मुझे कुछ भी मिलता है तो मैं समाधान के लिए चारों ओर खोज करूंगा और अपनी पोस्ट को अपडेट करूंगा।
दूधमांसरेगेज

0

आप उपयोग कर सकते हैं

sudo -u <user> -i 

जो पढ़ेगा .bashrc/ .bash_profile

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.