আমি কীভাবে একটি জাভা অ্যাপ্লিকেশন লিখতে পারি যা রানটাইমে নিজেকে আপডেট করতে পারে?


91

আমি একটি জাভা অ্যাপ্লিকেশন (সার্ভার অ্যাপ্লিকেশন) প্রয়োগ করতে চাই যা প্রদত্ত ইউআরএল থেকে একটি নতুন সংস্করণ (.জার ফাইল) ডাউনলোড করতে পারে এবং তারপরে রানটাইমে নিজেকে আপডেট করতে পারে।

এটি করার সর্বোত্তম উপায় কী এবং এটি কি সম্ভব?

আমি অনুমান করি যে অ্যাপ্লিকেশনটি একটি নতুন .jar ফাইল ডাউনলোড করে এটি শুরু করতে পারে। তবে হ্যান্ডওভারটি কীভাবে করা উচিত, উদাহরণস্বরূপ নতুন অ্যাপ্লিকেশন কখন শুরু হবে তা জেনে এবং তারপরে প্রস্থান করুন। অথবা এটি করার আরও ভাল উপায় আছে?


4
আপনি জাভা ওয়েব স্টার্ট তাকিয়েছেন? এটি রানটাইমে নিজেকে আপডেট করে না যদিও, আমি বিশ্বাস করি, (পুনরায় আরম্ভ করা আবশ্যক), এর জন্য আপনাকে সম্ভবত ওএসজিআই দেখতে হবে।
থাইলো

@ থিলো: আমি মনে করি যে প্রদত্ত ইউআরএল থেকে একটি ফাইল ডাউনলোড করা সহজ হবে এবং তারপরে চলমান জার ফাইল থেকে একটি লিনাক্স কমান্ড দিয়ে এটি শুরু করুন।
জোনাস

4
জাভা ওয়েবস্টার্ট এপিআই এর ডিজাইন চলমান অবস্থায় আপডেট করা অসম্ভব করে তোলে। দুর্ভাগ্যক্রমে
থরবজর্ন রাভন অ্যান্ডারসন


@ মনিব বস আপনি রক করেছেন, আপনি আমার দিনটি তৈরি করেছেন :)
ইলতাফ খালিদ

উত্তর:


68

সমাধানের মূল কাঠামোটি নিম্নরূপ:

  • অ্যাপটির সর্বশেষ সংস্করণটি বারবার লোড করার জন্য এবং এটি চালু করার জন্য দায়ী একটি প্রধান লুপ।

  • অ্যাপ্লিকেশনটি তার কাজটি করে তবে পর্যায়ক্রমে ডাউনলোডের ইউআরএল পরীক্ষা করে। যদি এটি একটি নতুন সংস্করণ সনাক্ত করে তবে এটি আবার লঞ্চারে ফিরে আসে।

আপনি এটি প্রয়োগ করতে পারেন এমন অনেকগুলি উপায় রয়েছে। উদাহরণ স্বরূপ:

  • প্রবর্তকটি একটি মোড়ক স্ক্রিপ্ট বা বাইনারি অ্যাপ্লিকেশন হতে পারে যা একটি জেআর ফাইলটি প্রয়োগ করে একটি নতুন জেভিএম শুরু করে যা প্রতিস্থাপন হয়ে যায়।

  • প্রবর্তক জাভা অ্যাপ্লিকেশন হতে পারে যা নতুন জেআর জন্য একটি ক্লাসলোডার তৈরি করে, একটি এন্ট্রিপয়েন্ট ক্লাস লোড করে এবং এতে কিছু পদ্ধতি কল করে। আপনি যদি এভাবে এটি করেন তবে আপনাকে ক্লাসলোডার স্টোরেজ ফাঁসের জন্য নজর রাখতে হবে, তবে এটি কঠিন নয়। (আপনাকে কেবল এটি নিশ্চিত করতে হবে যে জার থেকে লোড হওয়া ক্লাসগুলির সাথে কোনও বস্তু পুনরায় আরম্ভ করার পরে আপনি পৌঁছাতে পারবেন না))

বাহ্যিক মোড়কের পদ্ধতির সুবিধাগুলি হ'ল:

  • আপনার কেবল একটি জেআর দরকার,
  • আপনি পুরো জাভা অ্যাপ্লিকেশন প্রতিস্থাপন করতে পারেন,
  • অ্যাপ্লিকেশন দ্বারা তৈরি কোনও গৌণ থ্রেড ইত্যাদি বিশেষ শাটডাউন যুক্তি ছাড়াই চলে যাবে এবং
  • আপনি অ্যাপ্লিকেশন ক্র্যাশ ইত্যাদির পুনরুদ্ধার নিয়েও ডিল করতে পারেন

দ্বিতীয় পদ্ধতির জন্য দুটি জেআর প্রয়োজন, তবে নিম্নলিখিত সুবিধাগুলি রয়েছে:

  • সমাধানটি খাঁটি জাভা এবং পোর্টেবল,
  • পরিবর্তনটি দ্রুত হবে, এবং
  • আপনি পুনরায় আরম্ভ (মডুলো ফুটো ইস্যু) জুড়ে আরও সহজে রাষ্ট্র বজায় রাখতে পারবেন।

"সেরা" উপায়টি আপনার নির্দিষ্ট প্রয়োজনীয়তার উপর নির্ভর করে।

এটিও লক্ষ করা উচিত:

  • অটো আপডেট করার সাথে সাথে সুরক্ষা ঝুঁকি রয়েছে। সাধারণভাবে, আপডেটগুলি সরবরাহকারী সার্ভারটি যদি আপোস করা হয় বা আপডেট সরবরাহ করার পদ্ধতিগুলি আক্রমণ করার জন্য সংবেদনশীল হয়, তবে স্বয়ংক্রিয়ভাবে আপডেট করা ক্লায়েন্ট (গুলি) এর সাথে আপস হতে পারে।

  • ক্লায়েন্টের ক্ষতি হওয়ার কারণ এমন কোনও ক্লায়েন্টকে আপডেট ঠেকানো আইনী ঝুঁকি এবং আপনার ব্যবসায়ের খ্যাতিতে ঝুঁকিপূর্ণ হতে পারে।


আপনি যদি চাকাটি পুনরায় উদ্ভাবন করা এড়ানোর কোনও উপায় খুঁজে পান তবে এটি ভাল। পরামর্শের জন্য অন্যান্য উত্তরগুলি দেখুন।


43

আমি বর্তমানে একটি জাএভিএ লিনাক্স ডেমন বিকাশ করছি এবং একটি স্বয়ংক্রিয় আপডেট পদ্ধতি প্রয়োগ করার প্রয়োজনও ছিল। আমি আমার অ্যাপ্লিকেশনটিকে একটি জার ফাইলের মধ্যে সীমাবদ্ধ করতে চেয়েছিলাম, এবং একটি সহজ সমাধান নিয়ে এসেছি:

আপডেটেটারে অ্যাপ্লিকেশন অ্যাপ্লিকেশনটি প্যাক করুন।

অ্যাপ্লিকেশন : যখন অ্যাপ্লিকেশনটি একটি নতুন সংস্করণ সনাক্ত করে এটি নিম্নলিখিতটি করে:

  1. ডাউনলোড আপডেট (জিপফাইল)
  2. অ্যাপ্লিকেশন এবং অ্যাপ্লিকেশনআপডেটর এক্সট্রাক্ট করুন (জিপফাইলে সমস্ত)
  3. আপডেটেটর চালান

অ্যাপ্লিকেশনআপডেটর : আপডেটেটরটি চালিত হলে এটি নিম্নলিখিতগুলি করে:

  1. অ্যাপ্লিকেশনটি বন্ধ করুন (আমার ক্ষেত্রে ডিএনমন মাধ্যমে ডেমন)
  2. বর্তমান অ্যাপ্লিকেশনটি ওভাররাইট করতে ডাউনলোড করা জার ফাইলটি অনুলিপি করুন
  3. অ্যাপ্লিকেশন শুরু করুন
  4. পরিষ্কার কর.

আশা করি এটি কাউকে সাহায্য করবে।


12

এটি একটি পরিচিত সমস্যা এবং আমি একটি চাকা পুনর্নবীকরণের বিরুদ্ধে প্রস্তাব দিচ্ছি - আপনার নিজের হ্যাকটি লিখবেন না, কেবল অন্য লোকেরা ইতিমধ্যে যা করেছে তা ব্যবহার করুন।

দুটি পরিস্থিতি আপনার বিবেচনা করা উচিত:

  1. অ্যাপ্লিকেশনটিকে স্ব-আপডেটযোগ্য হতে হবে এবং আপডেটের পরেও চলমান রাখতে হবে (সার্ভার অ্যাপ, এম্বেড করা অ্যাপস)) ওএসজিআই: বান্ডিলস বা ইকুইনক্স পি 2 সহ যান ।

  2. অ্যাপ্লিকেশন একটি ডেস্কটপ অ্যাপ্লিকেশন এবং একটি ইনস্টলার রয়েছে। আপডেট অপশন সহ অনেক ইনস্টলার রয়েছে। ইনস্টলারগুলির তালিকা পরীক্ষা করুন ।


12

আমি সম্প্রতি আপডেট 4 জে তৈরি করেছি যা জাভা 9 এর মডিউল সিস্টেমের সাথে সম্পূর্ণ সুসংগত।

এটি পুনরায় আরম্ভ না করে নির্বিঘ্নে নতুন সংস্করণ শুরু করবে।


বুটস্ট্র্যাপ / ব্যবসায়িক প্রয়োগের দৃষ্টান্ত ব্যবহার করে। বুটস্ট্র্যাপটি ব্যবসায়িক অ্যাপ্লিকেশনটিকে লোড এবং আনলোড করে এবং এটি বুটস্ট্র্যাপ যা সাধারণত আপডেট করে।
মর্দচাই

10

আমি একটি জাভা অ্যাপ্লিকেশন লিখেছি যা রানটাইমের সময় প্লাগইনগুলি লোড করতে পারে এবং তত্ক্ষণাত্ জেডিটিতে অনুরূপ প্রক্রিয়া দ্বারা অনুপ্রাণিত হয়ে সেগুলি ব্যবহার শুরু করতে পারে। jEdit ওপেন সোর্স তাই আপনার কীভাবে এটি কাজ করে তা দেখার বিকল্প রয়েছে।

সমাধানটি জার থেকে ফাইলগুলি লোড করার জন্য একটি কাস্টম ClassLoader ব্যবহার করে। এগুলি লোড হয়ে গেলে আপনি নতুন জার থেকে কিছু পদ্ধতি শুরু করতে পারেন যা এর mainপদ্ধতি হিসাবে কাজ করবে । তারপরে জটিল অংশটি নিশ্চিত করছে যে আপনি পুরানো কোডের সমস্ত উল্লেখ থেকে মুক্তি পেয়েছেন যাতে এটি আবর্জনা সংগ্রহ করা যায়। আমি সেই অংশটির বিষয়ে বিশেষজ্ঞ নই, আমি এটি কাজ করেছিলাম তবে এটি সহজ ছিল না।


আমি জাভা সম্পর্কে জানি না, তবে সি # তে, আপনি স্পষ্টভাবে কোড আনলোড করতে অ্যাপডোমাইনস ব্যবহার করতে পারেন। জাভাতেও হয়ত এই জাতীয় ধারণা রয়েছে।
মের্লিন মরগান-গ্রাহাম

4
ধন্যবাদ, এটি যাওয়ার উপায় বলে মনে হচ্ছে। ClassLoader এরNetworkClassLoader জন্য জাভাডকের
জোনাস

আপনি কি একই জেভিএমের মধ্যে স্থিতিশীল ভেরিয়েবলগুলি নিয়ে সমস্যায় পড়েছেন, বা স্থায়ী প্রজন্মের কী করবেন? আমি শুনেছি এগুলি ক্লাস আনলোড সম্পর্কিত বিষয়ে সমস্যাগুলি উপস্থাপন করতে পারে।
IDE

5
  1. প্রথম উপায়: টমক্যাট ব্যবহার করুন এবং এটি সুবিধাগুলি স্থাপন করুন।
  2. দ্বিতীয় উপায়: দুটি ভাগে অ্যাপ্লিকেশন বিভক্ত করা (ক্রিয়ামূলক এবং আপডেট) এবং আপডেট অংশটি ফাংশন অংশটি প্রতিস্থাপন করুন।
  3. তৃতীয় উপায়: আপনার সার্ভার অ্যাপ্লিকেশনটিতে কেবল নতুন সংস্করণ ডাউনলোড করুন, তারপরে পুরানো সংস্করণটি আবদ্ধ পোর্টটি প্রকাশ করবে, তারপরে পুরানো সংস্করণটি নতুন সংস্করণ চালাবে (প্রক্রিয়া শুরু হয়), তারপরে পুরানো সংস্করণটি পুরানো সংস্করণ, পুরানো সংস্করণ মুছতে নতুন সংস্করণে অ্যাপ্লিকেশন পোর্টে একটি অনুরোধ প্রেরণ করে সমাপ্তি এবং নতুন সংস্করণ পুরানো সংস্করণ মুছে দেয়। এটার মত: বিকল্প পাঠ

আপনার দ্বিতীয় উপায়টি একটি আকর্ষণীয় নকশা বলে মনে হচ্ছে।
জোনাস

2

এটি অগত্যা সেরা নয় উপায় নয়, তবে এটি আপনার পক্ষে কার্যকর হতে পারে।

আপনি একটি বুটস্ট্র্যাপ অ্যাপ্লিকেশন লিখতে পারেন (আলা ওয়ার্কক্র্যাফ্ট লঞ্চারের ওয়ার্ল্ড, যদি আপনি ওউ খেলেন)। আপডেটগুলি পরীক্ষা করার জন্য সেই বুটস্ট্র্যাপ দায়ী।

  • যদি কোনও আপডেট উপলভ্য থাকে তবে এটি ব্যবহারকারীর কাছে এটি সরবরাহ করবে, ডাউনলোড, ইনস্টলেশন ইত্যাদি পরিচালনা করবে
  • যদি অ্যাপ্লিকেশনটি আপ টু ডেট থাকে তবে এটি ব্যবহারকারীকে অ্যাপ্লিকেশনটি চালু করার অনুমতি দেবে
  • বৈকল্পিকভাবে, আপনি অ্যাপ্লিকেশনটি লঞ্চ করার অনুমতি দিতে পারেন, তা আপ টু ডেট না হলেও

এইভাবে আপনাকে আপনার অ্যাপ্লিকেশন থেকে প্রস্থান করার জন্য চাপ দেওয়ার দরকার নেই।

যদি আপনার অ্যাপ্লিকেশন ওয়েব ভিত্তিক হয় এবং যদি এটি গুরুত্বপূর্ণ হয় যে তাদের একটি আপ টু ডেট ক্লায়েন্ট রয়েছে তবে অ্যাপ্লিকেশনটি চলাকালীন আপনি সংস্করণ চেকও করতে পারেন। সার্ভারের (কিছু বা সমস্ত কল) বা উভয়ের সাথেই সাধারণ যোগাযোগের সময় আপনি এগুলি বিরতিতে করতে পারেন।

আমি সম্প্রতি যে পণ্যটিতে কাজ করেছি তার জন্য, আমরা লঞ্চের পরে সংস্করণ চেক করেছি (বুট স্ট্র্যাপার অ্যাপ্লিকেশন ছাড়াই, তবে মূল উইন্ডোটি উপস্থিত হওয়ার আগে) এবং সার্ভারে কল করার সময়। যখন ক্লায়েন্টটির মেয়াদ শেষ হয়ে গিয়েছিল, আমরা ম্যানুয়ালি ছাড়তে ব্যবহারকারীর উপর নির্ভর করেছিলাম তবে সার্ভারের বিরুদ্ধে কোনও পদক্ষেপ নিতে নিষেধ করেছি।

দয়া করে মনে রাখবেন যে আপনি নিজের প্রধান উইন্ডোটি আনার আগে জাভা ইউআই কোড শুরু করতে পারে কিনা তা আমি জানি না। আমরা সি # / ডাব্লুপিএফ ব্যবহার করছিলাম।


ধন্যবাদ, এটি করার একটি দুর্দান্ত উপায়। তবে এটি একটি সার্ভার অ্যাপ্লিকেশন তাই কোনও ব্যবহারকারী নেই যা কিছু পদক্ষেপ নিতে পারে। এবং আমি এটি পছন্দ করি যে এটি কেবলমাত্র একটি একক জার ফাইল, সুতরাং ব্যবহারকারী ইজিলি একক বয়াম ডাউনলোড করে শুরুতে এটি শুরু করতে পারে তবে এর পরে আমার কোনও ব্যবহারকারীর ইন্টারঅ্যাকশন থাকতে চাই না।
জোনাস

আপনি যখন "সার্ভার অ্যাপ্লিকেশন" বলছেন, আপনি কি লগ ইন করার সময় এটির অর্থ অ্যাপ্লিকেশন যা সরাসরি সার্ভারে চালিত হয়?
মার্লিন মরগান-গ্রাহাম

@ জোনাস: .jar ফাইলগুলি কীভাবে কাজ করে সে সম্পর্কে আমি খুব বেশি বুঝতে পারি না, তাই আমি সেখানে খুব বেশি সেবা পেতে পারি না। আপনি যদি জাভা সম্পর্কিত কোনও উত্তর পছন্দ করেন তবে আমি বুঝতে পারি। আশা করি এটি আপনাকে চিন্তার জন্য খাবার দেয়, কমপক্ষে :)
মার্লিন মরগান-গ্রাহাম

@ মেরলিন: আপনার ধারণাগুলি ভাগ করে নেওয়ার জন্য আমি কৃতজ্ঞ। হ্যাঁ, এটি একটি জাভা অ্যাপ্লিকেশন যা লিনাক্স সার্ভারে চলবে এবং সেই সার্ভারে কেউ লগইন হয়নি।
জোনাস

4
@ জোনাস: এমনটি নয় যে আপনি ইতিমধ্যে এটি সম্পর্কে ভাবেননি, তবে - বেশিরভাগ ওয়েব সার্ভিসে আমি দেখেছি একটি ম্যানুয়াল মোতায়েন করার কৌশল রয়েছে। আপনি কীভাবে আপডেটগুলি চেক করেন সে সম্পর্কে আপনি যত্নবান হতে চাইতে পারেন। আপনি যদি বগি / ভাঙা কোডটি ধাক্কা দিয়ে থাকেন বা কেবল পার্ট ওয়েইড ডাব্লু / একটি বহু-ফাইল মোতায়েন করেন তবে সার্ভারটি নিজেকে আপডেট করার চেষ্টা করতে পারে এবং তারপরে আপনার একটি ভাঙা সার্ভার রয়েছে।
মার্লিন মরগান-গ্রাহাম

2

আপনি যদি ইকুইনক্স প্লাগইন ব্যবহার করে আপনার অ্যাপ্লিকেশন তৈরি করেন তবে আপনি এই সমস্যার একটি রেডিমেড সমাধান পেতে পি 2 প্রভিশন সিস্টেমটি ব্যবহার করতে পারেন । এটি আপডেটের পরে সার্ভারটি নিজেকে পুনরায় চালু করতে হবে।


1

আমি একটি নতুন জার (ইত্যাদি) ডাউনলোড করার সময় একটি সুরক্ষা সমস্যা দেখতে পাচ্ছি, উদাহরণস্বরূপ, মাঝের আক্রমণে থাকা কোনও ব্যক্তি। আপনাকে সর্বদা আপনার ডাউনলোডযোগ্য আপডেটটিতে স্বাক্ষর করতে হবে।

JAX2015-এ, অ্যাডাম বাইন বাইনারিগুলি আপডেট করার জন্য জেজিট ব্যবহারের বিষয়ে বলেছিলেন। দুঃখের সাথে আমি কোনও টিউটোরিয়াল খুঁজে পাইনি।

জার্মান ভাষায় উত্স।

অ্যাডাম বিয়েন আপডেটেটর তৈরি করেছিলেন এখানে

আমি এখানে এটি কাঁটাচামচ কিছু জাভাএফএক্স ফ্রন্টএন্ড দিয়ে । আমি একটি স্বয়ংক্রিয় স্বাক্ষর নিয়েও কাজ করছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.