জেপিএ সহ কোটলিন: ডিফল্ট নির্মাতা নরক


131

জেপিএ হিসাবে যেমন @Entityক্লাসগুলির ডাটাবেস থেকে পুনরুদ্ধার করার সময় অবজেক্টগুলি ইনস্ট্যান্ট করার জন্য একটি ডিফল্ট (নন-আরগ) কনস্ট্রাক্টর থাকা উচিত।

কোটলিনে, সম্পত্তিগুলি প্রাথমিক কন্সট্রাক্টরের মধ্যে ঘোষণা করতে খুব সুবিধাজনক, যেমন নিম্নলিখিত উদাহরণ হিসাবে:

class Person(val name: String, val age: Int) { /* ... */ }

তবে যখন নন-আরগ কনস্ট্রাক্টরকে মাধ্যমিক হিসাবে ঘোষণা করা হয় তখন এটি প্রাথমিক কন্সট্রাক্টরকে পাস করার জন্য মানগুলির প্রয়োজন হয়, সুতরাং এখানে তাদের মতো কিছু বৈধ মান প্রয়োজন:

@Entity
class Person(val name: String, val age: Int) {
    private constructor(): this("", 0)
}

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

valতদ্ব্যতীত , নির্মাণকারী নির্বাহের পরে প্রপার্টি পুনরায় নিয়োগ করা যাবে না, তাই অপরিবর্তনীয়তাও হারিয়ে যায়।

সুতরাং প্রশ্নটি হল: কোটলিন কোডটি কীভাবে কোডের সদৃশতা ছাড়াই জেপিএর সাথে কাজ করতে অভিযোজিত হবে, "যাদু" প্রাথমিক মান এবং অপরিবর্তনীয়তা হারাবে?

PS এটি কি সত্য যে হাইপারনেটটি JPA এর পাশে রেখে কোনও ডিফল্ট নির্মাণকারী ছাড়া অবজেক্টগুলি তৈরি করতে পারে?


1
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)- সুতরাং, হ্যাঁ, হাইবারনেট ডিফল্ট নির্মাণকারী ছাড়া কাজ করতে পারে।
মাইকেল পিফেল

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

উত্তর:


145

Kotlin 1.0.6 এর হিসাবে , kotlin-noargকম্পাইলার প্লাগইন নির্বাচিত টীকা সঙ্গে সটীক করা হয়েছে শ্রেণীর জন্য সিন্থেটিক ডিফল্ট construtors জেনারেট করে।

যদি আপনি গ্রেড ব্যবহার করেন তবে kotlin-jpaপ্লাগইন প্রয়োগ করা এটিকে টিকানো ক্লাসগুলির জন্য ডিফল্ট কনস্ট্রাক্টর জেনারেট করার জন্য যথেষ্ট @Entity:

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    }
}

apply plugin: "kotlin-jpa"

মাভেনের জন্য:

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>

    <configuration>
        <compilerPlugins>
            <plugin>jpa</plugin>
        </compilerPlugins>
    </configuration>

    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-noarg</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
    </dependencies>
</plugin>

4
আপনার কোটলিন কোডের মধ্যে এটি কীভাবে ব্যবহৃত হবে সে সম্পর্কে আপনি সম্ভবত কিছুটা প্রসারিত করতে পারেন, এমনকি যদি এটি "আপনার data class foo(bar: String)পরিবর্তন হয় না" এর ক্ষেত্রেও হয়। এটি কীভাবে এটি জায়গায় খাপ খায় তার আরও একটি সম্পূর্ণ উদাহরণ দেখে ভাল লাগবে। ধন্যবাদ
thecoshman

5
এই ব্লগ পোস্টের চালু হয় kotlin-noargএবং kotlin-jpaতাদের উদ্দেশ্য বিশদ লিঙ্ক সহ blog.jetbrains.com/kotlin/2016/12/kotlin-1-0-6-is-here
Dalibor Filus

1
এবং গ্রাহকসংক্রান্ত পি কে এর মতো একটি প্রাথমিক কী শ্রেণীর কী, যা সত্তা নয় তবে একটি ডিফল্ট নির্মাণকারীর প্রয়োজন?
জান্নিক

3
আমার জন্য কাজ করছে না। এটি কেবল তখনই কার্যকর হয় যদি আমি কনস্ট্রাক্টর ক্ষেত্রগুলি বিকল্পগুলি করি works যার অর্থ প্লাগইন কাজ করছে না।
আইএক্সএক্স

3
@ জজনিক আপনি @Embeddableঅন্যথায় এটির প্রয়োজন না থাকলেও আপনি প্রাথমিক কী বর্গটি বৈশিষ্ট্যটির সাথে চিহ্নিত করতে পারেন । এইভাবে, এটি দ্বারা বাছাই করা হবে kotlin-jpa
এসভিচ

33

সমস্ত আর্গুমেন্টের জন্য কেবল ডিফল্ট মান সরবরাহ করুন, কোটলিন আপনার জন্য ডিফল্ট কনস্ট্রাক্টর তৈরি করবে।

@Entity
data class Person(val name: String="", val age: Int=0)

দেখতে NOTEনিম্নলিখিত অধ্যায় নিচের বাক্সে:

https://kotlinlang.org/docs/reference/classes.html#secondary-constructors


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

1
ডিফল্ট মান সরবরাহ করা খারাপ ধারণা কেন? জাভা এর কোনও আরগস কনস্টাক্টর ব্যবহার করার সময়ও ডিফল্ট মানগুলি ক্ষেত্রগুলিতে বরাদ্দ করা হয় (উদাহরণস্বরূপ রেফারেন্সের ধরণের কাছে নাল)।
উমেশ রাজভান্ডারী

1
এমন সময় আছে যার জন্য আপনি বুদ্ধিমান ডিফল্ট সরবরাহ করতে পারবেন না। কোনও ব্যক্তির প্রদত্ত উদাহরণটি ধরুন, আপনার সত্যিকারের এটি জন্মের তারিখের সাথে মডেল করা উচিত কারণ এটি পরিবর্তন হয় না (অবশ্যই, ব্যতিক্রমগুলি কোথাও কোথাও প্রযোজ্য) তবে তা দেওয়ার মতো কোনও বুদ্ধিমান ডিফল্ট নেই। সুতরাং খাঁটি কোড পয়েন্ট অব দৃষ্টিকোন গঠন করুন, আপনাকে অবশ্যই ব্যক্তি নির্মাতার মধ্যে একটি ডিওবি পাস করতে হবে, যাতে নিশ্চিত হওয়া যায় যে আপনার কোনও ব্যক্তির বৈধ বয়স নেই have সমস্যাটি হ'ল, জেপিএ যেভাবে কাজ করতে পছন্দ করে, এটি কোনও নো-আরগস কনস্ট্রাক্টরের সাথে কোনও জিনিস তৈরি করতে পছন্দ করে, তারপরে সবকিছু সেট করে।
thecoshman

1
আমি মনে করি এটি করার সঠিক উপায়, এই উত্তরটি অন্যান্য ক্ষেত্রে আপনি কাজ করে যা আপনি জেপিএ বা হাইবারনেটও ব্যবহার করেন না। উত্তরে বর্ণিত দলিল অনুসারে এটি প্রস্তাবিত উপায়।
মোহাম্মদ রফিঘ

1
এছাড়াও, আপনার জেপিএ সহ ডেটা ক্লাস ব্যবহার করা উচিত নয়: "ভাল বৈশিষ্ট্যযুক্ত ডেটা ক্লাস ব্যবহার করবেন না কারণ জেপিএ অপরিবর্তনীয় শ্রেণি বা ডেটা ক্লাস দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন পদ্ধতিগুলির সাথে কাজ করার জন্য ডিজাইন করা হয়নি।" বসন্ত.আইও
গাইডস /

11

@ ডি 3 এক্সটারের একটি মডেলের জন্য একটি ভাল উত্তর রয়েছে, অন্যটি কোটলিনে একটি নতুন বৈশিষ্ট্য বলা হয় lateinit:

class Entity() {
    constructor(name: String, age: Date): this() {
        this.name = name
        this.birthdate = age
    }

    lateinit var name: String
    lateinit var birthdate: Date
}

আপনি এটি ব্যবহার করবেন যখন আপনি নিশ্চিত হন যে নির্মাণের সময় কিছু খুব শীঘ্রই মান পূরণ করা হবে (বা উদাহরণের প্রথম ব্যবহারের আগে)।

আপনি আমি পরিবর্তন করে নোট হবে ageথেকে birthdateকারণ আপনার সঙ্গে আদিম মান ব্যবহার করতে পারবেন না lateinitএবং তারা মুহূর্ত হতে হবে জন্য var(সীমাবদ্ধতা ভবিষ্যতে মুক্তি হতে পারে)।

সুতরাং অপরিবর্তনীয়তার জন্য সঠিক উত্তর নয়, সেই ক্ষেত্রে অন্যান্য উত্তরগুলির মতো একই সমস্যা। এর সমাধান হ'ল লাইব্রেরিতে প্লাগইনগুলি যা ডিফল্ট কনস্ট্রাক্টরের প্রয়োজনের পরিবর্তে কোটলিন কনস্ট্রাক্টর এবং ম্যাপিং বৈশিষ্ট্যগুলি কনস্ট্রাক্টর প্যারামিটারগুলিতে বোঝে handle জ্যাকসন জন্য Kotlin মডিউল এই আছে, তাই এটি পরিষ্কারভাবে সম্ভব।

আরও দেখুন: অনুরূপ বিকল্পগুলির অনুসন্ধানের জন্য https://stackoverflow.com/a/34624907/3679676


মূল্যবান নোট যে ল্যাটিনাইট এবং ডেলিগেটস.নোট নাল () একই।
দ্রুততম

4
একই তবে একই নয়। যদি ডেলিগেট ব্যবহার করা হয় তবে এটি জাভা দ্বারা প্রকৃত ক্ষেত্রের ক্রমিককরণের জন্য যা দেখা যায় তা পরিবর্তিত করে (এটি প্রতিনিধি শ্রেণিটি দেখায়)। এছাড়াও, lateinitআপনি যখন নির্মাণের পরে খুব শীঘ্রই প্রাথমিকভাবে গ্যারান্টি সরবরাহের গ্যারান্টিযুক্ত লাইফাইসাইকেল ব্যবহার করবেন তখন এটি ব্যবহার করা ভাল it যদিও প্রতিনিধিরা "প্রথম ব্যবহারের আগে কখনও কখনও" এর জন্য অধিক লক্ষ্যযুক্ত। যদিও প্রযুক্তিগতভাবে তাদের একই আচরণ এবং সুরক্ষা রয়েছে, তারা অভিন্ন নয়।
জেইসন মিনার্ড

আপনার যদি আদিম মানগুলি ব্যবহার করার প্রয়োজন হয় তবে আমি কেবলমাত্র একটি বিষয়টিকে ইনস্ট্যান্ট করার সময় "ডিফল্ট মানগুলি" ব্যবহার করার কথা ভাবতে পারি এবং তার অর্থ আমি falseযথাক্রমে ইনটস এবং বুলিয়ানগুলির জন্য ব্যবহার করি । এটি কীভাবে ফ্রেমওয়ার্ক
কোডকে

6
@Entity data class Person(/*@Id @GeneratedValue var id: Long? = null,*/
                          var name: String? = null,
                          var age: Int? = null)

প্রাথমিক মানগুলির প্রয়োজন হয় যদি আপনি বিভিন্ন ক্ষেত্রের জন্য কনস্ট্রাক্টর পুনরায় ব্যবহার করতে চান, কোটলিন নালার অনুমতি দেয় না। সুতরাং আপনি যখনই বাদ পড়ার ক্ষেত্রের পরিকল্পনা করছেন তখন এই ফর্মটি কনস্ট্রাক্টারে ব্যবহার করুন:var field: Type? = defaultValue

jpa এর কোন যুক্তি নির্মাণকারীর প্রয়োজন নেই:

val entity = Person() // Person(name=null, age=null)

কোনও কোড সদৃশ নেই। আপনার যদি সত্ত্বা তৈরি করতে এবং শুধুমাত্র বয়স নির্ধারণের প্রয়োজন হয় তবে এই ফর্মটি ব্যবহার করুন:

val entity = Person(age = 33) // Person(name=null, age=33)

কোনও যাদু নেই (কেবলমাত্র ডকুমেন্টেশন পড়ুন)


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

@ ডিমাসান, আপনি ঠিকই বলেছেন, তবে এই থ্রেডটির কিছু পোস্টে ইতিমধ্যে ব্যাখ্যা রয়েছে ...
মাকসিম কোস্টরমিন

তবে আপনার স্নিপেটটি আলাদা এবং যদিও এর আলাদা বর্ণনা থাকতে পারে, যাইহোক এখন এটি আরও পরিষ্কার।
ডিমাসান

4

এইভাবে অপরিবর্তনীয়তা রাখার কোনও উপায় নেই। দৃষ্টান্তটি নির্মাণের সময় ভ্যালসগুলি শুরু করতে হবে।

অপরিবর্তনীয়তা ছাড়াই এটি করার একটি উপায়:

class Entity() {
    public constructor(name: String, age: Int): this() {        
        this.name = name
        this.age = age
    }

    public var name: String by Delegates.notNull()

    public var age: Int by Delegates.notNull()
}

তাই হাইবারনেটকে কন্সট্রাক্টর আরগসে কলাম মানচিত্র করতে বলার কোনও উপায় নেই? ঠিক আছে, হতে পারে, একটি ওআরএম কাঠামো / লাইব্রেরি রয়েছে যার জন্য নন-আরগ কনস্ট্রাক্টরের প্রয়োজন নেই? :)
হটকি

সে সম্পর্কে নিশ্চিত নন, দীর্ঘদিন ধরে হাইবারনেটের সাথে কাজ করেননি। তবে নামযুক্ত পরামিতিগুলি প্রয়োগ করে কোনওভাবে এটি সম্ভব হওয়া উচিত।
D3xter

আমি মনে করি হাইবারনেট কিছুটা কাজ (খুব বেশি নয়) দিয়ে এটি করতে পারে। জাভা 8-তে আপনি কন্সট্রাক্টরের নামযুক্ত প্যারামিটারগুলি রাখতে পারেন এবং সেগুলি এখন ক্ষেত্রের মতো ম্যাপ করা যেতে পারে।
খ্রিস্টান বনজিওর্নো

3

আমি বেশ কিছুদিন ধরে কোটলিন + জেপিএর সাথে কাজ করছি এবং কীভাবে সত্ত্বার ক্লাসগুলি লিখব তা আমি নিজের ধারণা তৈরি করেছি।

আমি আপনার প্রাথমিক ধারণাটি কিছুটা বাড়িয়ে দিচ্ছি। যেমনটি আপনি বলেছেন যে আমরা ব্যক্তিগত যুক্তিহীন নির্মাতা তৈরি করতে পারি এবং আদিমদের জন্য ডিফল্ট মান সরবরাহ করতে পারি, কিন্তু যখন আমরা অন্য শ্রেণি ব্যবহার করার চেষ্টা করি তখন এটি কিছুটা অগোছালো হয়ে যায়। আমার ধারণা হ'ল সত্তা শ্রেণীর জন্য স্থিতিশীল STUB অবজেক্ট তৈরি করা যা আপনি বর্তমানে লিখছেন যেমন:

@Entity
data class TestEntity(
    val name: String,
    @Id @GeneratedValue val id: Int? = null
) {
    private constructor() : this("")

    companion object {
        val STUB = TestEntity()
    }
}

এবং যখন আমার টেস্টএন্টিটির সাথে সম্পর্কিত সত্তা শ্রেণি রয়েছে তখন আমি স্রেফ তৈরি করা স্টাবটি সহজেই ব্যবহার করতে পারি। উদাহরণ স্বরূপ:

@Entity
data class RelatedEntity(
        val testEntity: TestEntity,
        @Id @GeneratedValue val id: Long? = null
) {
    private constructor() : this(TestEntity.STUB)

    companion object {
        val STUB = RelatedEntity()
    }
}

অবশ্যই এই সমাধানটি নিখুঁত নয়। আপনার এখনও কিছু বয়লারপ্লেট কোড তৈরি করতে হবে যা প্রয়োজন হবে না। এছাড়াও একটি ক্ষেত্রে রয়েছে যে একসাথে শ্রেণীর মধ্যে পিতা-মাতার সন্তানের সম্পর্ক - স্টাব দিয়ে খুব সুন্দরভাবে সমাধান করা যায় না: এরকম:

@Entity
data class TestEntity(
        val testEntity: TestEntity,
        @Id @GeneratedValue val id: Long? = null
) {
    private constructor() : this(STUB)

    companion object {
        val STUB = TestEntity()
    }
}

এই কোডটি মুরগি-ডিম ইস্যুর কারণে নালপয়েন্টার এক্সসেপশন তৈরি করবে - STUB তৈরি করতে আমাদের স্টুব দরকার। দুর্ভাগ্যক্রমে আমাদের কোডটি কাজ করতে এই ক্ষেত্রটি nullable (বা কিছু অনুরূপ সমাধান) তৈরি করতে হবে।

এছাড়াও আমার মতে শেষ ক্ষেত্র হিসাবে আইডি থাকা (এবং অবনমিত) বেশ অনুকূল। আমাদের এটি হাত দ্বারা বরাদ্দ করা উচিত নয় এবং ডাটাবেসটি এটি আমাদের জন্য করা উচিত।

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


3

উপরে বর্ণিত হিসাবে আপনাকে no-argজেটব্রায়েন্স দ্বারা সরবরাহিত কোনও প্লাগইন ব্যবহার করতে হবে ।

আপনি যদি ইলিস্প ব্যবহার করছেন তবে আপনাকে কোটলিন সংকলক সেটিংস সম্পাদনা করতে হতে পারে।

উইন্ডো> পছন্দসমূহ> কোটলিন> সংকলক

no-argসংকলক প্লাগইন বিভাগে প্লাগিনটি সক্রিয় করুন ।

দেখুন: https://discuss.kotlinlang.org/t/kotlin-allopen-plugin-doesnt-work-with- বনের / 13277/10


2

আমি নিজেই নুব তবে মনে হয় আপনাকে স্পষ্টত আরম্ভকারী এবং ফলব্যাকটি এর মতো নাল মান করতে হবে

@Entity
class Person(val name: String? = null, val age: Int? = null)

1

@ পাওয়েলবিয়ালের অনুরূপ আমি একটি ডিফল্ট উদাহরণ তৈরি করতে সহযোগী অবজেক্টটি ব্যবহার করেছি, তবে গৌণ কনস্ট্রাক্টর সংজ্ঞায়নের পরিবর্তে কেবলমাত্র @iolo এর মতো ডিফল্ট কনস্ট্রাক্টর আরগ ব্যবহার করুন। এটি আপনাকে একাধিক কনস্ট্রাক্টর সংজ্ঞায়িত করতে সক্ষম করেছে এবং কোডটি সহজ রাখে (যদিও মঞ্জুর করা হলেও "স্টাব" সাথী অবজেক্টগুলি সংজ্ঞায়িত করা একে একে ঠিক সরল রাখছে না)

@Entity
data class TestEntity(
    val name: String = "",
    @Id @GeneratedValue val id: Int? = null
) {

    companion object {
        val STUB = TestEntity()
    }
}

এবং তারপরে সম্পর্কিত ক্লাসগুলির জন্য TestEntity

@Entity
data class RelatedEntity(
    val testEntity: TestEntity = TestEntity:STUB,
    @Id @GeneratedValue val id: Int? = null
)

@ পাভেলবিয়াল যেমন উল্লেখ করেছেন, কনস্ট্রাক্টর চালিত হওয়ার পরে STUB আরম্ভ করা হবে না সেহেতু ক্লাসটি যখন TestEntity" TestEntityক্লাস " করে সেখানে কাজ করবে না।


1

এই গ্রেডল বিল্ড লাইনগুলি আমাকে সহায়তা করেছে:
https://plugins.gradle.org/plugin/org.jetbrains.kotlin.plugin.jpa/1.1.50
কমপক্ষে, এটি ইন্টেলিজজে তৈরি করে। এটি এই মুহুর্তে কমান্ড লাইনে ব্যর্থ হচ্ছে।

এবং আমি একটি আছে

class LtreeType : UserType

এবং

    @Column(name = "path", nullable = false, columnDefinition = "ltree")
    @Type(type = "com.tgt.unitplanning.data.LtreeType")
    var path: String

var পাথ: LtreeType কাজ করেনি।


1

আপনি যদি গ্রেড প্লাগইনটি https://plugins.gradle.org/plugin/org.jetbrains.kotlin.plugin.jpa যোগ করেছেন তবে কাজ করেন নি, তবে সংস্করণটি তারিখ হয়ে গেছে। আমি 1.3.30 এ ছিল এবং এটি আমার পক্ষে কার্যকর হয়নি। আমি 1.3.41 এ উন্নীত হওয়ার পরে (লেখার সময় সর্বশেষতম), এটি কার্যকর হয়েছিল।

দ্রষ্টব্য: কোটলিন সংস্করণটি এই প্লাগইনটির মতো হওয়া উচিত, উদাহরণস্বরূপ: আমি উভয়ই এভাবে যুক্ত করেছি:

buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    }
}

আমি মাইক্রোনট সঙ্গে কাজ করছি, এবং আমি এটি সংস্করণ 1.3.41 এর সাথে কাজ করতে পেরেছি। গ্রেডল বলেছে আমার কোটলিন সংস্করণটি 1.3.21 এবং আমি কোনও সমস্যা দেখতে পাইনি, অন্যান্য সমস্ত প্লাগইন ('কেপ্ট / জেভিএম / অ্যালোপেন') 1.3.21 এ রয়েছে এছাড়াও আমি প্লাগিনগুলি ডিএসএল ফর্ম্যাটটি ব্যবহার করছি
গাভিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.